理解题意之后,这题就是一个简单地矩阵幂运算,用类似二分的方法水过~~ 值得注意的是,当k为0时,水将保留在原来的瓶子里。 #include<stdio.h> #include<string.h> const int maxn = 21; struct Matrix { double matrix[maxn][maxn]; }; double ans[maxn]; Matrix init, unit; int n; Matrix matrix_mul(Matrix a, Matrix b) { Matrix c; int i, j, kk; for(i = 0; i < n; i++) for(j = 0; j < n; j++) { c.matrix[i][j] = 0; for(kk = 0; kk < n; kk++) c.matrix[i][j] += a.matrix[i][kk]*b.matrix[kk][j]; } return c; } Matrix matrix_pow(Matrix a, int m) { if(m == 1) return a; else if(m & 1) return matrix_mul(a, matrix_pow(a, m-1)); else { Matrix b = matrix_pow(a, m/2); return matrix_mul(b, b); } /* Matrix i = init, u = unit; while(m != 1) { if(m%2 != 0) { --m; u = matrix_mul(i, u); } else { m /= 2; i = matrix_mul(i, i); } } i = matrix_mul(i, u); return i; */ } //#define LOCAL int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif int test; int i, j, k, m; scanf("%d", &test); for(int i = 0; i < maxn; i++) unit.matrix[i][i] = 1; while(test--) { memset(init.matrix, 0.0, sizeof(init.matrix)); scanf("%d", &n); for( i = 0; i < n; i++) scanf("%lf", &ans[i]); for( i = 0; i < n; i++) { scanf("%d", &k); if(k == 0) init.matrix[i][i] = 1.0; else { double tmp = 1.0/k; for( j = 0; j < k; j++) { scanf("%d", &m); init.matrix[m-1][i] = tmp; } } } scanf("%d", &m); Matrix temp = matrix_pow(init, m); double res; for(int i = 0; i < n-1; i++) { res = 0.0; for(int j = 0; j < n; j++) res += temp.matrix[i][j] * ans[j]; printf("%.2lf ", res); } res = 0.0; for(int j = 0; j < n; j++) res += temp.matrix[n-1][j] * ans[j]; printf("%.2lf/n", res); } return 0; }