1 1 1 2 2 0 0 3 7 23 47 16
构造矩阵b:
b[0]=233
b[1]=a[1]
b[2]=a[2]
b[3]=a[3]
......
b[n+1]=3
例如 样例3
b[0]=233
b[1]=23
b[2]=47
b[3]=16
b[4]=3
递推矩阵A,样例3
10 0 0 0 1
1 1 0 0 0
1 1 1 0 0
1 1 1 1 0
0 0 0 0 1
n+2阶方阵
A^m*b的第n项就是结果
代码:
//1046ms #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int mod=10000007; struct matrix { long long ma[13][13]; }a; int n,m; long long b[13]; matrix multi(matrix x,matrix y)//矩阵相乘 { matrix ans; memset(ans.ma,0,sizeof(ans.ma)); for(int i=0;i<=n+1;i++) { for(int j=0;j<=n+1;j++) { for(int k=0;k<=n+1;k++) { ans.ma[i][j]=(ans.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod; } } } return ans; } int main() { while(~scanf("%d%d",&n,&m)) { memset(a.ma,0,sizeof(a.ma)); b[0]=233; for(int i=1;i<=n;i++) { scanf("%I64d",&b[i]); } b[n+1]=3; a.ma[0][0]=10;//构造a矩阵 a.ma[0][n+1]=1; a.ma[n+1][n+1]=1; for(int i=1;i<=n;i++) { for(int j=0;j<=i;j++) { a.ma[i][j]=1; } } matrix ans; memset(ans.ma,0,sizeof(ans.ma)); for(int i=0;i<=n+1;i++)//单位矩阵 { for(int j=0;j<=n+1;j++) { if(i==j) ans.ma[i][j]=1; } } while(m)//矩阵快速幂 { if(m&1) { ans=multi(ans,a); } a=multi(a,a); m=(m>>1); } matrix mp; memset(mp.ma,0,sizeof(mp.ma)); for(int i=0;i<=n+1;i++)//a的m次方与b矩阵相乘 { for(int k=0;k<=n+1;k++) { mp.ma[i][0]=(mp.ma[i][0]+ans.ma[i][k]*b[k])%mod; } } printf("%I64d\n",mp.ma[n][0]); } return 0; }