题意:
给定x0,x1,a,b,n,mod,求Xn%mod,n<=1e6
题解:
矩阵快速幂,因为n很大,故这里用十进制快速幂
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e6+10;
char s[maxn];
int mod;
struct node{
LL a[2][2];
node operator * (node b){
node res;
res.a[0][0]=res.a[1][1]=res.a[0][1]=res.a[1][0]=0;
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
res.a[i][j]=(res.a[i][j]+a[i][k]*b.a[k][j])%mod;
return res;
}
}ans,res[11],temp;
node fast(node a,int n){
temp.a[0][0]=temp.a[1][1]=1;
temp.a[0][1]=temp.a[1][0]=0;
while(n){
if(n&1) temp=temp*a;
a=a*a;
n>>=1;
}
return temp;
}
int main(){
LL x0,x1,a,b;
scanf("%lld%lld%lld%lld%s%lld",&x0,&x1,&a,&b,s,&mod);
ans.a[0][0]=ans.a[1][1]=1;
res[0].a[0][0]=res[0].a[1][1]=1;
res[0].a[0][1]=res[0].a[1][0]=0;
res[1].a[0][0]=a,res[1].a[0][1]=b;
res[1].a[1][0]=1,res[1].a[1][1]=0;
///初始化前9个
for(int i=2;i<=9;++i)
res[i]=res[i-1]*res[1];
int len=strlen(s);
int k;
for(int i=0;i<len;++i){
ans=fast(ans,10);
k=s[i]-'0';
ans=ans*res[k];
}
printf("%lld\n",(ans.a[1][0]*x1+ans.a[1][1]*x0)%mod);
return 0;
}