矩阵乘法。
可以观察出来,每一列往下一列和每一行往下一行递推都是固定的, 那么肯定不能把行当状态矩阵,而,可以把列当成状态矩阵。一列一列的往前推。对于2333这些的加可以通过,状态矩阵头上加上两个,23和3,即
来解决。
可以推出转移矩阵(n=3的时候)
#include <bits/stdc++.h>
#define ms(a,b) memset(a,b,sizeof(a))
#define mc(a,b) memcpy(a,b,sizeof(b))
using namespace std;
typedef long long ll;
const int N=15;
const ll mod=1e7+7;
int n,m;
void mul1(ll f[N],ll a[N][N])
{
ll c[N];
ms(c,0);
for(int j=1;j<=n+2;j++)
for(int k=1;k<=n+2;k++) c[j]=(c[j]+f[k]*a[k][j])%mod;
mc(f,c);
}
void mul2(ll a[N][N],ll b[N][N])
{
ll c[N][N];
ms(c,0);
for(int i=1;i<=n+2;i++)
for(int j=1;j<=n+2;j++)
for(int k=1;k<=n+2;k++) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod;
mc(a,c);
}
void qpow(ll a[N][N],int b)
{
ll c[N][N];
ms(c,0);
for(int i=1;i<=n+2;i++) c[i][i]=1;
while(b)
{
if(b&1) mul2(c,a);
b>>=1;
mul2(a,a);
}
mc(a,c);
}
int main()
{
ll f[N],a[N][N];
while(~scanf("%d%d",&n,&m))
{
ms(a,0);
ms(f,0);
f[1]=23,f[2]=3;
a[1][1]=10;
a[2][1]=1;
a[2][2]=1;
for(int i=3;i<=n+2;i++)
{
scanf("%lld",&f[i]);
a[1][i]=10;
a[2][i]=1;
}
for(int i=3;i<=n+2;i++)
for(int j=i;j<=n+2;j++) a[i][j]=1;
qpow(a,m);
mul1(f,a);
printf("%lld\n",f[n+2]);
}
}