hdu_5667_sequence
来源:互联网 发布:淘宝客买家平台 编辑:程序博客网 时间:2024/06/04 18:25
题目链接:点击打开链接
题目描述:
Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 969 Accepted Submission(s): 310
15 3 3 3 233
190
n=1n=2otherw
#include<set>#include<map>#include<list>#include<queue>#include<stack>#include<cmath>#include<vector>#include<cstdio>#include<stdlib.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;#define pb(a) push_back(a)#define mp(a,b) make_pair(a,b)#define in(a) scanf("%d",&a)#define out(a) printf("%d")#define ll long long#define FOR(i,l,r) for(int i=l;i<=r;i++)ll p,n,a,b,c;struct matrix{ ll m[4][4];};matrix mul(matrix &m1,matrix &m2){ matrix ret; memset(ret.m,0,sizeof(ret.m)); for(int i=0;i<3;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++) { ret.m[i][j]+=(m1.m[i][k]*m2.m[k][j])%(p-1); ret.m[i][j]%=(p-1); } return ret;}ll Pow(ll x,ll y){ ll ret=1; x=x%p; while(y) { if(y&1)ret=ret*x%p; x=x*x%p; y=y/2; } return ret;}matrix ma_pow(matrix ma,ll x){ matrix ret; memset(ret.m,0,sizeof(ret.m)); for(int i=0;i<3;i++) ret.m[i][i]=1; while(x) { if(x&1)ret=mul(ret,ma); ma=mul(ma,ma); x=x/2; } return ret;}int main(){ int t; cin>>t; while(t--) { cin>>n>>a>>b>>c>>p; if(n==1) { printf("1\n"); continue; } if(n==2) { printf("%I64d\n",Pow(a,b)); continue; } matrix node; node.m[0][0]=c,node.m[0][1]=1,node.m[0][2]=b; node.m[1][0]=1,node.m[1][1]=0,node.m[1][2]=0; node.m[2][0]=0,node.m[2][1]=0,node.m[2][2]=1; matrix no; no=ma_pow(node,n-2); ll ans=no.m[0][0]*b+no.m[0][2]; ans=Pow(a,ans); printf("%I64d\n",ans); } return 0;}