http://blog.csdn.net/kep159/article/details/39272075
第一行左移一位,序列变为线性,构造矩阵快速幂
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
const ll mod=1e7+7;
int n,m;
ll p[12];
struct node
{
ll a[12][12];
}T,I;
node multi(node A,node B)
{
int i,j,k;
node C;
memset(C.a,0,sizeof(C.a));
for(i=0;i<=n+1;i++)
for(j=0;j<=n+1;j++)
{
for(k=0;k<=n+1;k++)
{
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j]%=mod;
}
C.a[i][j]=(C.a[i][j]+mod)%mod;
}
return C;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,k;
for(i=1;i<=n;i++)
scanf("%I64d",&p[i]);
for(i=0;i<=n+1;i++)
for(j=0;j<=n+1;j++)
if(i==j) I.a[i][j]=1;
else I.a[i][j]=0;
memset(T.a,0,sizeof(T.a));
T.a[0][0]=10;
T.a[0][n+1]=1;
for(i=1;i<=n;i++)
for(j=0;j<=i;j++)
T.a[i][j]=1;
T.a[n+1][n+1]=1;
while(m)
{
if(m&1)
I=multi(I,T);
m>>=1;
T=multi(T,T);
}
p[0]=233;
p[n+1]=3;
ll sum=0;
for(i=0;i<=n+1;i++)
{
sum+=p[i]*I.a[n][i];
sum%=mod;
}
cout<<sum<<endl;
}
}