HDU 1757 A Simple Math Problem (矩阵+快速幂)

来源:互联网 发布:烟台网络党校 编辑:程序博客网 时间:2024/04/29 21:02

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1757

题意:已知当n<10时,f(n)=n,当n≥10时f(n)=a0*f(n-1)+a2*f(n-2)+....+a9*f(n-10),告诉你a0~a9,和n,mod,求f(n)%mod

分析:矩阵快速幂.....和nyoj 301题递推求值差不多,构造矩阵即可。http://blog.csdn.net/w20810/article/details/43835393

代码:

#include <iostream>#include <cstdio>using namespace std;typedef long long LL;int N,MOD;struct Matrax{LL mat[10][10];}U,F;Matrax multi(Matrax a,Matrax b){Matrax ans;int i,j,k;for(i=0;i<10;i++)for(j=0;j<10;j++){ans.mat[i][j]=0;for(k=0;k<10;k++)ans.mat[i][j]+=(a.mat[i][k]*b.mat[k][j]);ans.mat[i][j]%=MOD;}return ans;}Matrax matrax_pow(int n){Matrax ans=U,p=F;while(n){if(n&1)ans=multi(ans,p);n>>=1;p=multi(p,p);}return ans;}void Init(){for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(i==j)U.mat[i][j]=1LL;elseU.mat[i][j]=0LL;for(int i=1;i<10;i++)F.mat[i-1][i]=1LL;}int main(){Init();int i,j;LL x;while(scanf("%d%d",&N,&MOD)!=EOF){for(i=0;i<10;i++){scanf("%lld",&F.mat[i][0]);F.mat[i][0]%=MOD;}if(N<10){printf("%d\n",N%MOD);continue;}N-=9;LL ans=0;Matrax temp=matrax_pow(N);for(i=9;i>=0;i--)ans+=(i*temp.mat[9-i][0])%MOD;printf("%lld\n",LL(ans%MOD));}return 0;}



0 0
原创粉丝点击