http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2853
//1865331 2009-05-11 21:26:46 Accepted 2853 C++ 3790 1484 aslys
#include<iostream>
using namespace std;
const int N = 204;
int n;
double matrix[N][N];
double x[N][N],y[N][N],z[N][N];
void fun(int k,double m[][N])
  {
int i,j,p,t;
double sum;
if(k == 1) //矩阵的一次方
 {
for(i=0;i<n;i++)
for(j=0;j<n;j++)
m[i][j] = matrix[i][j];
}
else if(k == 2) //矩阵的二次方
 {
for(i=0;i<n;i++)
for(j=0;j<n;j++)
 {
sum = matrix[i][0] * matrix[0][j];
for(p=1;p<n;p++)
sum += matrix[i][p] * matrix[p][j];
m[i][j] = sum;
}
}
else //矩阵的 k 次方 ,先计算出 k/2 次方 ,加快计算速度
 {
t = k/2;
fun(t,x); //递归调用
for(i=0;i<n;i++)
for(j=0;j<n;j++)
 {
sum = x[i][0] * x[0][j];
for(p=1;p<n;p++)
sum += x[i][p] * x[p][j];
y[i][j] = sum;
}
if( k % 2 == 1) // 比如对矩阵A :A^9 = A^4 * A^4 * A
 {
for(i=0;i<n;i++)
for(j=0;j<n;j++)
 {
sum = matrix[i][0] * y[0][j];
for(p=1;p<n;p++)
sum += matrix[i][p] * y[p][j];;
m[i][j] = sum;
}
}
else
 {
for(i=0;i<n;i++)
for(j=0;j<n;j++)
m[i][j] = y[i][j];
}
}
}

int main()
  {
int m;
while(scanf("%d%d",&n,&m)!=EOF)
 {
if( m==0 && n==0 )
break;
int i,j,k;
double num[N],r;
for(i=0;i<n;i++)//init()
for(j=0;j<n;j++)
 {
if(i == j)
matrix[i][j] = 1.0;
else
matrix[i][j] = 0.0;
}

for(i=0;i<n;i++)
scanf("%lf",&num[i]);

scanf("%d",&k);
while(k--)
 {
scanf("%d%d%lf",&i,&j,&r);
matrix[j][i] += r; //构建初始矩阵
matrix[i][i] -= r;
}

fun(m,z); //求矩阵的m次方,结果放在 x 数组中

r = 0.0;
for(j=0;j<n;j++)
r += z[n-1][j] * num[j];
printf("%.0lf\n",r);
}
return 0;
}
 /**//*
3 1
40 20 10
2
0 1 1
1 2 1
3 2
40 20 10
2
0 1 1
1 2 1
*/
|