标签:des style blog http color io os java ar
1 1 1 2 2 0 0 3 7 23 47 16
234 2799 72937Hint
题解及代码:
矩阵快速幂的题目,推出矩阵就可以了,具体推的方法就是有矩阵的第一列推出第二列,以此类推就可以了。
这里给出10的矩阵:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <map> using namespace std; const __int64 mod=10000007; struct mat //矩阵的定义 { __int64 t[13][13]; void set() { memset(t,0,sizeof(t)); } } a,b,c; mat multiple(mat a,mat b,int n,int p) //矩阵相乘函数 { int i,j,k; mat temp; temp.set(); for(i=0; i<n; i++) for(j=0; j<n; j++) { if(a.t[i][j]!=0) for(k=0; k<n; k++) temp.t[i][k]=(temp.t[i][k]+a.t[i][j]*b.t[j][k]+p)%p; } return temp; } mat quick_mod(mat b,int n,int m,int p) { mat t; t.set(); for(int i=0;i<n;i++) t.t[i][i]=1; while(m) { if(m&1) { t=multiple(t,b,n,p); } m>>=1; b=multiple(b,b,n,p); } return t; } void init(int n) { a.set(); for(int i=0;i<=n;i++) { if(i==0) for(int j=0;j<=n;j++) a.t[j][i]=1; else if(i==1) for(int j=1;j<=n;j++) a.t[j][1]=10; else for(int j=i;j<=n;j++) a.t[j][i]=1; } } int main() { int n,m; __int64 s[14]; while(scanf("%d%d",&n,&m)!=EOF) { s[0]=3; s[1]=23; for(int i=2;i<=n+1;i++) { scanf("%I64d",&s[i]); } init(n+1); b=quick_mod(a,n+2,m,mod); __int64 ans=0; for(int i=0;i<=n+1;i++) ans=(ans+(s[i]*b.t[n+1][i])%mod)%mod; printf("%I64d\n",ans); } return 0; }
标签:des style blog http color io os java ar
原文地址:http://blog.csdn.net/knight_kaka/article/details/39296743