http://acm.hdu.edu.cn/showproblem.php?pid=5015
行数很小 可以想到快速幂
a[i][j]=a[i][j-1]+a[i-1][j]=a[i][j-1]+a[i-1][j-1]+a[i-2][j-1]=a[i][j-1]+a[i-1][j-1]+...+a[1][j-1]+a[0][j]
这样就找出第j列和第(j-1)列的递推关系 构造矩阵(n=5)
1 0 0 0 0
1 1 0 0 0
1 1 1 0 0
1 1 1 10 0
0 0 0 1 1
using namespace std;
const ll mod=10000007;
ll mat[20][20],res[20][20];
ll a[20];
int n,m;
void getmul(ll u[][20],ll v[][20])
{
ll t[20][20];
int i,j,k;
for(i=1;i<=n+2;i++)
{
for(j=1;j<=n+2;j++)
{
t[i][j]=0;
for(k=1;k<=n+2;k++)
{
t[i][j]=(t[i][j]+(u[i][k]*v[k][j])%mod)%mod;
}
}
}
memcpy(u,t,sizeof(t));
}
void quickpow()
{
int i,j;
memset(mat,0,sizeof(mat));
for(i=1;i<=n+1;i++)
{
for(j=1;j<=i;j++)
{
mat[i][j]=1ll;
}
}
mat[n+1][n+1]=10ll,mat[n+2][n+1]=1ll,mat[n+2][n+2]=1ll;
memset(res,0,sizeof(res));
for(i=1;i<=n+2;i++) res[i][i]=1ll;
while(m>0)
{
if(m%2) getmul(res,mat);
getmul(mat,mat);
m/=2;
}
}
int main()
{
ll ans;
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++) scanf("%lld",&a[i]);
quickpow();
ans=0ll;
for(i=1;i<=n;i++) ans=(ans+(a[i]*res[n-i+1][1])%mod)%mod;
ans=(ans+(233ll*res[n+1][1])%mod)%mod;
ans=(ans+(3ll*res[n+2][1])%mod)%mod;
printf("%lld\n",ans);
}
return 0;
}