题目给出的n大小不超过10,可以转化为矩阵快速幂
看成列上的矩阵乘法,第一列是 23,a0,a1,a2......,an,3
矩阵为:
10 0 0 0 ... 1
10 1 0 0 ... 1
10 1 1 0 ... 1
: : : : :
10 1 1 1 ... 1
0 0 0 0 ... 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const ll MOD=1e7+7;
int N;
struct node
{
ll a[15][15];
};
node shu,ans,mp;
//shu是输入的矩阵,ans是所求答案
node matrix(node x,node y)
{
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
mp.a[i][j]=0;
for(int p=1;p<=N;p++)
mp.a[i][j]=(mp.a[i][j]+x.a[i][p]*y.a[p][j]+MOD)%MOD;
//矩阵乘法
}
return mp;
}
void work(ll k)
{//矩阵快速幂
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
ans.a[i][j]=0;
for(int i=1;i<=N;i++) ans.a[i][i]=1;
node t=shu;
while(k){
if(k&1)
ans=matrix(ans,t);
k>>=1;
t=matrix(t,t);
}
}
ll a[15];
ll get(ll n,ll m)
{
N=n+2;
memset(shu.a,0,sizeof(shu.a));
for(int i=2;i<=n+1;i++)
for(int j=2;j<=i;j++)
shu.a[i][j]=1;
for(int i=1;i<=n+2;i++) shu.a[i][n+2]=1;
for(int i=1;i<=n+1;i++) shu.a[i][1]=10;
work(m);
ll ret=0;
for(int i=1;i<=n+2;i++)
ret=(ret+ans.a[n+1][i]*a[i])%MOD;
return ret;
}
int main()
{
ll n,m;
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]);
printf("%lld\n",get(n,m));
}
return 0;
}