http://acm.hdu.edu.cn/showproblem.php?pid=5015
1 1 1 2 2 0 0 3 7 23 47 16
#include <stdio.h> #include <string.h> #include <iostream> #include <math.h> #include <queue> #include <stack> #include <vector> #include <algorithm> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int N=10005; const int MOD=10000007; int n; LL m,a[20]; struct Matrix { LL m[15][15]; }; Matrix I; Matrix mult(Matrix a,Matrix b) { Matrix c; for(int i=0;i<n+2;i++) for(int j=0;j<n+2;j++) { c.m[i][j]=0; for(int k=0;k<n+2;k++) c.m[i][j]+=(a.m[i][k]*b.m[k][j])%MOD; c.m[i][j]%=MOD; } return c; } Matrix quick_mod(Matrix a,LL n) { Matrix c=I; while(n) { if(n&1) c=mult(c,a); n>>=1; a=mult(a,a); } return c; } int main() { while(~scanf("%d%I64d",&n,&m)) { a[0]=3; a[1]=23; for(int i=2;i<n+2;i++) scanf("%I64d",&a[i]); for(int i=0;i<n+2;i++) for(int j=0;j<n+2;j++) if(i==j) I.m[i][j]=1; else I.m[i][j]=0; /* for(int i=0;i<n+2;i++) { for(int j=0;j<n+2;j++) printf("%I64d ",I.m[i][j]); printf("\n"); }*/ Matrix A; for(int i=0;i<n+2;i++) for(int j=0;j<n+2;j++) if(i>=j) A.m[i][j]=1; else A.m[i][j]=0; for(int i=1;i<n+2;i++) A.m[i][1]=10; LL ans=0; Matrix B=quick_mod(A,m); /*for(int i=0;i<n+2;i++) { for(int j=0;j<n+2;j++) printf("%I64d ",B.m[i][j]); printf("\n"); }*/ for(int i=0;i<n+2;i++) ans=(ans+B.m[n+1][i]*a[i]%MOD)%MOD; printf("%I64d\n",ans); } return 0; }