/* 构造转移矩阵: 先推公式: 首先是第0行:A[0][j+1]=A[0][j]*10+3 1-n行: A[i][j+1]=A[i][j]+A[i-1][j+1]=... =A[i][j]+A[i-1][j]+...+A[1][j]+A[0][j+1] 所以第j+1行状态可以由第j行通过乘上一个转移矩阵得到 那么就是转移矩阵的构造 设F[j]为第j列,F[j+1]为第j+1列,B为转移矩阵 有 F[j+1]=B*F[j] 按照递推性质 1 0 0 0 0 ... 0 3 3 1 10 0 0 0 ... 0 A[0][j] A[0][j+1] 1 10 1 0 0 ... 0 * A[1][j] = A[1][j+1] 1 10 1 1 0 ... 0 A[2][j] . 1 10 1 1 1 ... 0 A[3][j] . 1 10 1 1 1 ... 1 A[n][j] A[n][j+1] 规定初始数组F[0]=[3,233,a1,a2...an] */ #include<bits/stdc++.h> using namespace std; #define ll long long #define mod 10000007 ll F[13],a[13]; ll n,m; struct Mat{ ll m[13][13]; Mat(){memset(m,0,sizeof m);} }; void mul1(Mat A,ll F[13]){ ll B[13]={}; for(int i=0;i<n+2;i++) for(int j=0;j<n+2;j++) B[i]=(B[i]+A.m[i][j]*F[j]%mod)%mod; memcpy(F,B,sizeof B); } void mul2(Mat & A,Mat B){ Mat C; for(int i=0;i<n+2;i++) for(int j=0;j<n+2;j++) for(int k=0;k<n+2;k++) C.m[i][j]=(C.m[i][j]+A.m[i][k]*B.m[k][j]%mod)%mod; memcpy(A.m,C.m,sizeof C.m); } int main(){ while(cin>>n>>m){ F[0]=3,F[1]=23; for(int i=2;i<n+2;i++)cin>>F[i]; Mat A,B; for(int i=0;i<n+2;i++)A.m[i][0]=1; for(int i=1;i<n+2;i++)A.m[i][1]=10; for(int j=2;j<n+2;j++) for(int i=j;i<n+2;i++) A.m[i][j]=1; while(m){ if(m%2) mul1(A,F); mul2(A,A); m>>=1; } cout<<F[n+1]<<endl; } }