题目链接
给定n,m和n个第一列的数,根据题目给的关系求。
把每行加的3看作前一列最后一行的3*1构成,所以根据递推关系可得矩阵A:
再利用矩阵快速幂求解即可
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int mod=1e7+7;
int N;
struct matrix{
ll x[15][15];
};
matrix multi(matrix a,matrix b)//矩阵相乘
{
matrix tmp;
memset(tmp.x,0,sizeof(tmp.x));
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
for(int k=1;k<=N;k++)
{
tmp.x[i][j]+=a.x[i][k]*b.x[k][j];
tmp.x[i][j]%=mod;
}
return tmp;
}
matrix quick_multi(matrix a,ll k)//矩阵快速幂
{
matrix tmp=a;
k--;
while(k){
if(k&1)
tmp=multi(tmp,a);
a=multi(a,a);
k>>=1;
}
return tmp;
}
int main(){
ll n,m;
ll a[15];
while(~scanf("%lld%lld",&n,&m)){
a[1]=23;a[n+2]=3;
for(int i=2;i<=n+1;i++)
scanf("%lld",&a[i]);
N=n+2;matrix A;
memset(A.x,0,sizeof(A.x));
for(int i=2;i<=n+1;i++)
for(int j=2;j<=i;j++)
A.x[i][j]=1;
for(int i=1;i<=n+2;i++)
A.x[i][n+2]=1;
for(int i=1;i<=n+1;i++)
A.x[i][1]=10;
// for(int i=1;i<=N;i++){
// for(int j=1;j<=N;j++)
// printf("%d ",A.x[i][j]);
// printf("\n");
// }
matrix ans;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
ans.x[i][j]=0;
for(int i=1;i<=N;i++)
ans.x[i][i]=1;
A=quick_multi(A,m);
ans=multi(ans,A);
ll res=0;
for(int i=1;i<=n+2;i++)
res=(res+ans.x[n+1][i]*a[i])%mod;
printf("%lld\n",res);
}
return 0;
}