矩阵快速幂太暴力了
给出以下证明:
稍微有常识的高考生都会解决这个问题
设 且
解得
设 有
即
根据给出的递推式知
由上式知:
不难看出令
和最开始的式子是相通的
所以就可以快速求出
当然注意特判一下a=1原因我想大家都懂
然后就完了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef int INT;
const int N=1e6+100;
#define int long long
const int mod=1e9+7;
int quick_pow(int x,int k){
int ret=1;
while(k){
if(k%2==1){
ret=ret*x%mod;
}
k=k/2;
x=x*x%mod;
}
return ret;
}
struct Node{
int Ori,Uni;
}n,m;
char s1[N],s2[N];
int a,b,c,d;
void Process(char *ch,Node &A){
int len=strlen(ch);
for(int i=0;i<len;i++){
A.Ori=(A.Ori*10+ch[i]-'0')%(mod-1);
A.Uni=(A.Uni*10+ch[i]-'0')%(mod);
}
}
INT main(){
// freopen("P1397.in","r",stdin);
scanf("%s%s",s1,s2);
Process(s1,n);
// cout<<n.Ori<<" "<<n.Uni<<'\n';
Process(s2,m);
cin>>a>>b>>c>>d;
if(a==1){
a=c;
b=(b*c%mod*(m.Uni-1)%mod+d)%mod;
}
else{
int t=quick_pow(a,m.Ori-1)*c%mod;
b=(b*c%mod*(quick_pow(a-1,mod-2))%mod*(quick_pow(a,m.Ori-1)-1)%mod+d)%mod;
a=t;
}
int ans;
if(a==1){
ans=(1+b*n.Uni%mod)%mod;
ans=((ans-d)+mod)%mod*quick_pow(c,mod-2)%mod;
}
else{
ans=(quick_pow(a,n.Ori)+(quick_pow(a,n.Ori)-1)*b%mod*quick_pow(a-1,mod-2))%mod;
ans=(ans-d+mod)%mod*quick_pow(c,mod-2)%mod;
}
cout<<ans;
}