按列递推,每次转移乘上一个矩阵,推导出的矩阵是
/*=============================================================================
# Author:Erich
# FileName:
=============================================================================*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#define lson id<<1,l,m
#define rson id<<1|1,m+1,r
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=1ll<<60;
const double PI=acos(-1.0);
int n,m;
const int N=15;
const int mod=10000007;
struct Mat
{
ll d[N][N];
};
void Unit(Mat &a)
{
memset(a.d,0,sizeof a.d);
for (int i=0; i<N; i++)
a.d[i][i]=1;
}
Mat operator*(Mat a,Mat b)
{
Mat c;
memset(c.d,0,sizeof c.d);
for (int i=0; i<N; i++)
for (int j=0; j<N; j++)
for (int k=0; k<N; k++)
c.d[i][j]+=a.d[i][k]*b.d[k][j],c.d[i][j]%=mod;
return c;
}
Mat pow_mod(Mat a,int x)
{
Mat c;
Unit(c);
while(x)
{
if (x&1) c=c*a;
a=a*a;
x>>=1;
}
return c;
}
Mat a;
int x;
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&x))
{
memset(a.d,0,sizeof a.d);
a.d[0][0]=233;
for (int i=1; i<=n; i++) scanf("%d",&a.d[0][i]);
a.d[0][n+1]=3;
Mat b;
memset(b.d,0,sizeof b.d);
for (int i=1; i<=n; i++)
for (int j=0; j<=i; j++)
b.d[j][i]=1;
b.d[n+1][0]=b.d[n+1][n+1]=1;
b.d[0][0]=10;
Mat c=pow_mod(b,x);
a=a*c;
printf("%I64d\n",a.d[0][n]);
}
return 0;
}