nyoj 301 递推求值(矩阵快速幂)
2017-04-03 20:21
225 查看
递推求值
ps:矩阵快速幂的入门题
思路:
先构造两个矩阵,其中一个为矩阵A,作为初始矩阵
f2 f1 1
0 0 0
0 0 0
另一个为矩阵B
b 1 0
a 0 0
c 0 1
因为F(2)和F(1)是已知的,当n>=3时,每次都乘以矩阵B,就能推出下一个矩阵。而矩阵的第一行第一列的元素就是所求的结果。
代码:
#include<stdio.h> #include<string.h> #define N 3 #define mod 1000007 #define mem(a,b) memset(a,b,sizeof(a)) typedef long long LL; struct Matrix { LL mat ; }; Matrix unit_matrix= { 1,0,0, 0,1,0, 0,0,1 };//单位矩阵 Matrix mul(Matrix a,Matrix b)//矩阵相乘 { Matrix res; for(int i=0; i<N; ++i) for(int j dd66 =0; j<N; ++j) { res.mat[i][j]=0; for(int k=0; k<N; ++k) res.mat[i][j]=(res.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod; } return res; } Matrix pow_matrix(Matrix a,LL n)//矩阵快速幂 { Matrix res=unit_matrix; while(n) { if(n&1) res=mul(res,a); a=mul(a,a); n>>=1; } return res; } int main() { LL t,f1,f2,a,b,c,n; Matrix tmp,arr; scanf("%lld",&t); while(t--) { scanf("%lld%lld%lld%lld%lld%lld",&f1,&f2,&a,&b,&c,&n); if(n==1) printf("%lld\n",(f1+mod)%mod); else if(n==2) printf("%lld\n",(f2+mod)%mod); else { mem(arr.mat,0); mem(tmp.mat,0); arr.mat[0][0]=f2,arr.mat[0][1]=f1,arr.mat[0][2]=1;//构造初始矩阵 tmp.mat[0][0]=b,tmp.mat[1][0]=a,tmp.mat[2][0]=c; tmp.mat[0][1]=tmp.mat[2][2]=1; Matrix p=pow_matrix(tmp,n-2); p=mul(arr,p);//注意p和arr不要写反了 LL ans=(p.mat[0][0]+mod)%mod; printf("%lld\n",ans); } } return 0; }
相关文章推荐
- nyoj 301 递推求值(矩阵快速幂)
- nyoj--301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- NYOJ 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- 【矩阵快速幂*模板】nyoj 301 递推求值
- nyoj 301递推求值(矩阵快速幂的递推求值)
- nyoj301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- NYOJ——301递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)
- NYOJ301 递推求值(矩阵快速幂)
- nyoj 301 递推求值(矩阵快速幂)