构造矩阵+快速幂
1 1 1 2 2 0 0 3 7 23 47 16
234 2799 72937Hint
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long int LL;
const LL MOD=10000007LL;
int n,m;
LL a[20];
struct Matrix
{
int x,y;
LL matrix[12][12];
Matrix()
{
x=y=0;
memset(matrix,0,sizeof(matrix));
}
};
void init(Matrix& m)
{
m.x=m.y=n+2;
for(int i=0;i<m.x-2;i++)
for(int j=i;j<m.y-1;j++)
m.matrix[i][j]=1;
m.matrix[m.x-2][m.y-2]=10;
m.matrix[m.x-1][m.y-1]=m.matrix[m.x-2][m.y-1]=1;
}
Matrix CHENGFA(Matrix& a,Matrix& b)
{
int n=a.x;
Matrix ret;
ret.x=ret.y=n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
LL temp=0;
for(int k=0;k<n;k++)
{
temp=(temp+(a.matrix[i][k]*b.matrix[k][j])%MOD)%MOD;
}
ret.matrix[i][j]=temp%MOD;
}
}
return ret;
}
Matrix MatrixQuickPow(Matrix m,int k)
{
Matrix e;
int n=m.x;
e.x=e.y=n;
for(int i=0;i<n;i++) e.matrix[i][i]=1;
while(k)
{
if(k%2)
e=CHENGFA(e,m);
m=CHENGFA(m,m);
k/=2;
}
return e;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=n-1;i>=0;i--)
scanf("%lld",a+i);
a[n]=233; a[n+1]=3;
Matrix M,ED;
init(M);
ED=MatrixQuickPow(M,m-1);
LL ans=0;
for(int i=0;i<n+1;i++)
{
LL temp=0;
for(int j=0;j<n+2;j++)
{
temp=(temp+(ED.matrix[i][j]*a[j])%MOD)%MOD;
}
ans=(ans+temp)%MOD;
}
printf("%I64d\n",ans);
}
return 0;
}
原文:http://blog.csdn.net/ck_boss/article/details/39295267