题意:给定一个序列的变换,求变换r次后各项的值。
思路:矩阵快速幂+矩阵变换知识。
#include <bits/stdc++.h> using namespace std; #define ll long long const int N=52; const int mod=1000; struct Matrix { int n, m, g[N][N]; Matrix(int _n, int _m) { n = _n; m = _m; for(int i=0;i<=n;i++) { for(int j=0;j<=m;j++) { g[i][j]=0; } } } // 矩阵相乘 Matrix operator * (const Matrix& y) { Matrix z(n, y.m); for(int i=0; i<n; i++) for(int j=0; j<y.m; j++) for(int k=0; k<m; k++){ int tmp=(long long )g[i][k]*y.g[k][j]%mod; z.g[i][j]=(z.g[i][j]+tmp)%mod; } return z; } }; // 矩阵模幂 Matrix Matrix_Powmul(Matrix x, int m) { Matrix z(x.n, x.n); for(int i=0; i<x.n; i++) z.g[i][i] = 1; while(m) { if(m & 1) z = z * x; x = x * x; m >>= 1; } return z; } int main() { int t; scanf("%d",&t); while(t--) { int n,r; scanf("%d%d",&n,&r); Matrix a=Matrix(n,1); for(int i=0;i<n;i++) { scanf("%d",&(a.g[i][0])); a.g[i][0]%=mod; } Matrix b=Matrix(n,n); for(int i=0;i<n;i++) { int x; scanf("%d",&x); for(int j=0;j<x;j++) { int pos; scanf("%d",&pos); b.g[i][pos]=1; } } Matrix ans1=Matrix_Powmul(b,r); Matrix ans=ans1*a; for(int i=0;i<n-1;i++) { printf("%d ",ans.g[i][0]); } printf("%d ",ans.g[n-1][0]); } }