数学专项matrix:UVa 11551
2013-08-07 23:21
253 查看
快速幂模板题。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=60; const int mod=1000; typedef int matrix[maxn][maxn]; int a[maxn],b[maxn]; int n,r; void mat_mul(matrix A,matrix B,matrix res) { matrix C; memset(C,0,sizeof(C)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) C[i][j]=(C[i][j]+A[i][k]*B[k][j])%mod; memcpy(res,C,sizeof(C)); } void mat_pow(matrix A,int m,matrix res) { matrix a,r; memset(r,0,sizeof(r)); memcpy(a,A,sizeof(a)); for(int i=0;i<n;i++) r[i][i]=1; while(m) { if(m&1) mat_mul(r,a,r); m>>=1; mat_mul(a,a,a); } memcpy(res,r,sizeof(r)); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&r); for(int i=0;i<n;i++) scanf("%d",&a[i]); matrix A; memset(A,0,sizeof(A)); for(int i=0;i<n;i++) { int t; scanf("%d",&t); for(int j=0;j<t;j++) { int p; scanf("%d",&p); A[i][p]=1; } } mat_pow(A,r,A); memset(b,0,sizeof(b)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) b[i]=(b[i]+A[i][j]*a[j])%mod; for(int i=0;i<n;i++) if(i) printf(" %d",b[i]); else printf("%d",b[i]); puts(""); } return 0; }
相关文章推荐
- 数学专项matrix:UVa 11149
- 数学专项matrix:UVa 10689
- 数学专项number_theory:UVa 11768
- 数学专项number_theory:UVa 10127
- 数学专项number_theory:UVa 10622
- 数学专项counting:UVa 580
- 数学专项number_theory:UVa 718
- 数学专项counting:UVa 417
- 数学专项counting:UVa 11529
- 数学专项game_theory:UVa 11927
- 数学专项number_theory:UVa 10515
- 数学专项number_theory:UVa 11728
- 数学专项number_theory:UVa 10162
- 数学专项number_theory:UVa 10236
- 数学专项number_theory:UVa 294
- 数学专项counting:UVa 11038
- 数学专项number_theory:UVa 10951
- 数学专项number_theory:UVa 10368
- 数学专项counting:UVa 11481
- 数学专项counting:UVa 10883