标签:des style blog http color io os java ar
1 1 1 2 2 0 0 3 7 23 47 16
234 2799 72937Hint
思路:
第一列元素为:
0
a1
a2
a3
a4
转化为:23
a1
a2
a3
a4
3
则第二列为:
23*10+3
23*10+3+a1
23*10+3+a1+a2
23*10+3+a1+a2+a3
23*10+3+a1+a2+a3+a4
3
根据前后两列的递推关系,有等式可得矩阵A的元素为:#include"iostream" #include"stdio.h" #include"string.h" #include"algorithm" #include"queue" #include"vector" using namespace std; #define N 15 #define LL __int64 const int mod=10000007; int n; int b[N]; struct Mat { LL mat[N][N]; }a,ans; Mat operator*(Mat a,Mat b) { int i,j,k; Mat c; memset(c.mat,0,sizeof(c.mat)); for(i=0; i<=n+1; i++) { for(j=0; j<=n+1; j++) { c.mat[i][j]=0; for(k=0; k<=n+1; k++) { if(a.mat[i][k]&&b.mat[k][j]) { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; c.mat[i][j]%=mod; } } } } return c; } void mult(int k) { int i; memset(ans.mat,0,sizeof(ans.mat)); for(i=0;i<=n+1;i++) ans.mat[i][i]=1; while(k) { if(k&1) ans=ans*a; k>>=1; a=a*a; } } void inti() { int i,j; b[0]=23; b[n+1]=3; for(i=1; i<=n; i++) scanf("%d",&b[i]); memset(a.mat,0,sizeof(a.mat)); for(i=0; i<=n; i++) { a.mat[i][0]=10; a.mat[i][n+1]=1; } a.mat[n+1][n+1]=1; for(i=1; i<n+1; i++) { for(j=1; j<=i; j++) { a.mat[i][j]=1; } } } int main() { int i,m; while(scanf("%d%d",&n,&m)!=-1) { inti(); mult(m); LL s=0; for(i=0;i<=n+1;i++) s=(s+(ans.mat[n][i]*b[i])%mod)%mod; printf("%I64d\n",s); } return 0; }
标签:des style blog http color io os java ar
原文地址:http://blog.csdn.net/u011721440/article/details/39401515