http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1811
不过我测试数据 第三组没过 估计是 取余这里错了
代码还是 贴一下吧。。 到时候 再 贴ac代码
#include<iostream> using namespace std; struct node{int p[100][100];}; node a,b,c,f; int mod; node cheng(node a,node b,int n,int t,int m ) { int i,j,k; node c; for(i=0;i<n;i++) for(j=0;j<m;j++) { int w; c.p[i][j]=0; for(k=0;k<t;k++) { w=((a.p[i][k]%mod)*(b.p[k][j]%mod))%mod; c.p[i][j]=(c.p[i][j]+w)%mod; } } return c; } void solve(__int64 n,int r,int q,int l) { while(n) { if(n%2==1) b=cheng(a,b,r,q,l); a=cheng(a,a,r,q,l); n/=2; } } int main() { int i,j,d; __int64 n; while(scanf("%d%I64d%d",&d,&n,&mod)) { if(d==0&&n==0&&mod==0) break; for(i=0;i<d;i++) for(j=0;j<d;j++) { if(i+1==j) a.p[i][j]=1; else if(i==d-1) scanf("%d",&a.p[i][j]); else a.p[i][j]=0; } for(i=0;i<d;i++) //b为单位矩阵 for(j=0;j<d;j++) if(i==j ) b.p[i][j]=1; else b.p[i][j]=0; solve(n-d,d,d,d); for(i=0;i<d;i++) scanf("%d",&f.p[i][0]); node temp; temp=cheng(b,f,d,d,1); if(n<=d) printf("%d",f.p[n-1][0]); else printf("%d\n",temp.p[d-1][0]); //printf(" mod %d\n",mod); } return 0; }