http://acm.hdu.edu.cn/showproblem.php?pid=1757 #include<iostream> using namespace std; #define N 10 #define FF(i,n) for(int i=0;i<n;i++) int ans[N]; int init[N][N]; void matrixMul(int a[][N],int b[][N],int n,int mod){ int i,j,k; int buf[N][N]={0}; FF(i,n)FF(k,n) if(a[i][k])FF(j,n)if(b[k][j]) buf[i][j]=(buf[i][j]+a[i][k]*b[k][j])%mod; FF(i,n)FF(j,n) a[i][j]=buf[i][j]; } void matrixMul(int a[],int b[][N],int n,int mod){ int i,j; int buf[N]={0}; FF(i,n)FF(j,n) buf[i]=(buf[i]+a[j]*b[i][j])%mod; FF(i,n) a[i]=buf[i]; } void matrixMul(int ans[],int init[][N],int n,int m,int mod){ for(;m;m>>=1){ if(m&1) matrixMul(ans,init,n,mod); matrixMul(init,init,n,mod); } } int main(void){ int n=10; int m,mod; int i,j; while(~scanf("%d%d",&m,&mod)){ memset(init,0,sizeof(init)); FF(i,n) ans[i]=9-i; FF(j,n) scanf("%d",&init[0][j]); for(int i=1;i<n;i++) init[i][i-1]=1; if(m<10){ printf("%d/n",ans[9-m]); continue; } m-=9; matrixMul(ans,init,n,m,mod); printf("%d/n",ans[0]); } }