标签:
题目链接:
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
/*5667 0MS 1584K 1835B G++ 2014300227*/ #include <bits/stdc++.h> using namespace std; const int N=1e4+5; typedef long long ll; const int mod=1e9+7; ll n,a,b,c,p; struct matrix { ll a[3][3]; }; matrix A; void Iint(ll x)//矩阵初始化; { A.a[0][0]=x; A.a[0][1]=1; A.a[0][2]=1; A.a[1][0]=1; A.a[1][1]=A.a[1][2]=0; A.a[2][0]=A.a[2][1]=0; A.a[2][2]=1; } matrix mul(matrix x,matrix y)//矩阵相乘 { matrix ans; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { ans.a[i][j]=0; for(int k=0;k<3;k++) { ans.a[i][j]+=(x.a[i][k]*y.a[k][j])%(p-1); ans.a[i][j]%=(p-1); } } } return ans; } ll fast_fun(matrix temp,ll num)//矩阵快速幂; { matrix s,base; for(int i=0;i<3;i++)//s初始化为单位矩阵 { for(int j=0;j<3;j++) { s.a[i][j]=0; base.a[i][j]=temp.a[i][j]; } } s.a[0][0]=s.a[1][1]=s.a[2][2]=1; while(num) { if(num&1) { s=mul(s,base); } base=mul(base,base); num=(num>>1); } return (s.a[0][0]+s.a[0][2])%(p-1); } ll fastpow(ll fx,ll fy)//快速幂求结果; { ll s=1,base=fx; while(fy) { if(fy&1) { s*=base; s%=p; } base*=base; base%=p; fy=(fy>>1); } return s; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&c,&p); Iint(c); if(n==1)printf("1\n"); else if(n==2)printf("%lld\n",fastpow(a,b)); else { if(a%p==0)printf("0\n"); else { ll gg=fast_fun(A,n-2)*b%(p-1); printf("%lld\n",fastpow(a,gg)); } } } return 0; }
hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)
标签:
原文地址:http://www.cnblogs.com/zhangchengc919/p/5401295.html