hdu 1757 A Simple Math Problem (矩陣快速冪)
阿新 • • 發佈:2018-11-25
題目連結:hdu 1757
題意:見連結。
題解:直接構造矩陣,然後弄個矩陣快速冪就行了。
程式碼如下:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; int mod; struct mat { LL a[15][15]; }; int num[15]; mat mat_mul(mat x,mat y) { mat res; for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { res.a[i][j]=0; for(int k=0;k<10;k++) res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%mod; } } return res; } mat mat_pow(int n) { mat c,res; memset(c.a,0,sizeof(c.a)); memset(res.a,0,sizeof(res.a)); for(int i=0;i<10;i++) ///初始化要相乘的矩陣 c.a[0][i]=num[i]; for(int i=1;i<10;i++) c.a[i][i-1]=1; for(int i=0;i<10;i++) ///單位陣 res.a[i][i]=1; while(n) { if(n&1) res=mat_mul(res,c); c=mat_mul(c,c); n>>=1; } return res; } int main() { int k,n; while(~scanf("%d%d",&k,&mod)) { for(int i=0;i<10;i++) scanf("%d",&num[i]); if(k<10){ printf("%d\n",k);continue; } mat result; result=mat_pow(k-9); ///計算矩陣 LL sum=0; for(int i=0;i<10;i++) sum=(sum+result.a[0][i]*(9-i))%mod; printf("%lld\n",sum); } return 0; }