对于案例:
1 2 100.00 100.00 1 2 2 1 2 2
a = a - a + b/2 = 0 + b/2
b = b - b/2 + a = a + b/2
可构造矩阵
| 0 1/2| | 1 1/2|
A = (B^n) * A
#include<cstdio> #include<cstring> #include<cstdlib> const int maxn = 22; struct Matrix { double m[maxn][maxn]; }; int n; int min; Matrix matrixMul(Matrix a, Matrix b) { Matrix tmp; int i, j, k; for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { tmp.m[i][j] = 0; for(k = 1; k <= n; k++)tmp.m[i][j] += a.m[i][k] * b.m[k][j]; } } return tmp; } Matrix powMatrixMul(Matrix ans, Matrix ra) { while(min >= 1) { if(min & 1)ans = matrixMul(ra, ans); ra = matrixMul(ra, ra); min /= 2; } return ans; } int main() { int t; scanf("%d",&t); while(t--) { int i, j, f, k; Matrix ans, ra; scanf("%d",&n); memset(ans.m, 0, sizeof(ans.m)); memset(ra.m, 0, sizeof(ra.m)); for(i = 1; i <= n; i++) scanf("%lf", &ans.m[i][1]); for(i = 1; i <= n; i++) { scanf("%d",&k); if(k == 0) ra.m[i][i] = 1; for(j = 1; j <= k; j++) { scanf("%d",&f); ra.m[f][i] = 1.0 / k; } } scanf("%d",&min); ans = powMatrixMul(ans, ra); printf("%.2lf", ans.m[1][1]); for(i = 2; i <= n; i++) printf(" %.2lf", ans.m[i][1]); printf("\n"); } return 0; }