标签:
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1190 Accepted Submission(s): 700
233 | a11 |
a21 | a31 | a41 | ... | 3 |
*
10 | 1 | 1 | 1 | 1 | ... | 0 |
0 | 1 | 1 | 1 | 1 | ... | 0 |
0 | 0 | 1 | 1 | 1 | ... | 0 |
0 | 0 | 0 | 1 | 1 | ... | 0 |
0 | 0 | 0 | 0 | 1 | ... | 0 |
... | ... | ... | ... | ... | ... | ... |
1 | 0 | 0 | 0 | 0 | ... | 1 |
=
......................................................................................................................................................
#include<cstdlib> #include<cstring> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define LL __int64 #define mod 10000007 LL N,M; struct matrix { LL m[15][15]; }; LL a[15]; matrix multiply(matrix x,matrix y) { matrix temp; memset(temp.m,0,sizeof(temp.m)); for(int i=0; i<N+2; i++) { for(int j=0; j<N+2; j++) { if(x.m[i][j]==0) continue; for(int k=0; k<N+2; k++) { if(y.m[j][k]==0) continue; temp.m[i][k]+=x.m[i][j]*y.m[j][k]%mod; temp.m[i][k]%=mod; } } } return temp; } matrix quickmod(matrix a,LL n) { matrix res; memset(res.m,0,sizeof(res.m)); for(int i=0;i<N+2;i++) res.m[i][i]=1; while(n) { if(n&1) res=multiply(res,a); n>>=1; a=multiply(a,a); } return res; } int main() { int n,k; while(scanf("%d%d",&N,&M)!=EOF) { a[0]=233; a[N+1]=3; for(int i=1;i<=N;i++) { scanf("%d",&a[i]); } matrix ans; memset(ans.m,0,sizeof(ans.m)); ans.m[0][0]=10; ans.m[N+1][0]=1; ans.m[N+1][N+1]=1; for(int j=1;j<=N;j++) { for(int i=0;i<=j;i++) { ans.m[i][j]=1; } } ans=quickmod(ans,M);//M次幂定位到纵坐标。 LL ant=0; for(int i=0;i<N+2;i++)//横坐标是N,即,乘以矩阵的N列。 { ant=(ant+a[i]*ans.m[i][N])%mod; } printf("%I64d\n",ant); } return 0; }
标签:
原文地址:http://www.cnblogs.com/yuyixingkong/p/4343064.html