#include <stdio.h> #include <cstring> #include <iostream> using namespace std; typedef long long LL; LL tmp[11][11],a[11][11],b[11][11]; int mod; void mul(LL a[][11],LL b[][11]) { for(int i=0; i<10; i++) for(int j=0; j<10; j++) { tmp[i][j]=0; for(int k=0; k<10; k++) { tmp[i][j]+=a[i][k]*b[k][j]; if(tmp[i][j]>=mod) tmp[i][j]%=mod; } } memcpy(a,tmp,sizeof(tmp)); } void pow(LL a[][11],LL b[][11],int n) { memset(a,0,sizeof(a)); for(int i=0; i<10; i++) a[i][i]=1; while(n) { if(n&1) mul(a,b); mul(b,b); n>>=1; } } int main() { int k,x; while(scanf("%d%d",&k,&mod)==2) { memset(b,0,sizeof(b)); memset(a,0,sizeof(a)); for(int i=0; i<10; i++) { scanf("%d",&x); b[0][i]=x; } if(k<10) { printf("%d\n",k); continue; } for(int i=0; i<9; i++) b[i+1][i]=1; pow(a,b,k-9); int ans=0; for(int i=0; i<10; i++) ans+=a[0][i]*(9-i)%mod; printf("%d\n",ans%mod); } return 0; }
A Simple Math Problem hdu 1757
最新推荐文章于 2019-11-18 16:57:26 发布