十进制快速幂
#include<bits/stdc++.h> using namespace std; #define Long long long Long C[2][2],A[2][2],B[2][2]; Long x0,x1,a,b,n,mod,mod1; void mul(Long A[2][2],Long B[2][2]) { C[0][0]=(A[0][0]*B[0][0]%mod+A[0][1]*B[1][0]%mod)%mod; C[0][1]=(A[0][0]*B[0][1]%mod+A[0][1]*B[1][1]%mod)%mod; C[1][0]=(A[1][0]*B[0][0]%mod+A[1][1]*B[1][0]%mod)%mod; C[1][1]=(A[1][0]*B[0][1]%mod+A[1][1]*B[1][1]%mod)%mod; A[0][0]=C[0][0]; A[0][1]=C[0][1]; A[1][0]=C[1][0]; A[1][1]=C[1][1]; } char s[2000004]; Long qp() { Long ans[2][2]= {{1,0},{0,1}}; Long t[2][2]= {{1,0},{0,1}}; int n=strlen(s); int j=n-1; while(s[j]==‘0‘&&j>=0) { j--; } s[j]=s[j]-1; j++; while(j<n){s[j]=‘9‘;j++;} for(int i=n-1; i>=0; i--) { for(int j=1; j<=10; j++) { mul(t,A); if(j==s[i]-‘0‘) { mul(ans,t); } } A[0][0]=t[0][0]; A[0][1]=t[0][1]; A[1][1]=t[1][1]; A[1][0]=t[1][0]; t[0][0]=1; t[0][1]=0; t[1][1]=1; t[1][0]=0; } return (ans[0][0]%mod*x1%mod+ans[0][1]%mod*x0%mod)%mod; } int main() { scanf("%lld%lld%lld%lld",&x0,&x1,&a,&b); scanf("%s",s); scanf("%lld",&mod); // mod1=phi(mod); A[0][0]=a; A[0][1]=b; A[1][0]=1; A[1][1]=0; if(strcmp(s,"0")==0)cout<<x0<<‘\n‘; else { cout<<qp()<<‘\n‘; } }
原文:https://www.cnblogs.com/liulex/p/11284493.html