加了龟速乘还是60求助
查看原帖
加了龟速乘还是60求助
749280
xiaomo8125楼主2024/12/28 14:57
#include<iostream>
#define ll long long 
using namespace std;
ll m,a,c,x0,n,g,anss,base1[3][3],ans1[3][3];
ll mul(ll a ,ll b){
	if(b<0 && a<0){
		b=-b,a=-a;
	}
	else if(b<0){
		swap(a,b);
	}
	ll ans=0,base=a;
	while(b>0){
		if(b&1){
			ans=(ans+base)%m;
		}
		base=(base+base)%m;
		b>>=1;
	}
	return ans%m;
}
ll qpow(ll a,ll b){
	ll ans=1,base=a;
	while(b>0){
		if(b&1){
			ans=(ans*base)%m;
		}
		base=(base*base)%m;
		b>>=1;
	}
	return ans%m;
}
void jc(ll a[3][3],ll b[3][3]){
	ll c[3][3]={0};
	for(int k=1;k<=2;k++){
		for(int i=1;i<=2;i++){
			for(int j=1;j<=2;j++){
				c[i][j]=(c[i][j]+mul(a[i][k],b[k][j]))%m;
			}
		}
	}
	for(int i=1;i<=2;i++){
		for(int j=1;j<=2;j++){
			a[i][j]=c[i][j];
		}
	}
}

ll ksm(ll n){
	ll ans;
	base1[1][1]=0,base1[1][2]=1,base1[2][1]=-a,base1[2][2]=a+1;
	ans1[1][1]=1,ans1[2][2]=1,ans1[1][2]=0,ans1[2][1]=0;
	//[1,1+a] -> [...,1+...+a^n-1]
	//n-=2;
	while(n>0){
		if(n&1){
			jc(ans1,base1);
		}
		jc(base1,base1);
		//for(int i=1;i<=2;i++){
		//	for(int j=1;j<=2;j++){
		//		cout<<ans1[j][i]<<" ";
		//	}
		//	cout<<endl;
		//}
		n>>=1;
	}
	//cout<<ans1[1][2]<<" "<<ans1[2][2]<<endl;
	return (ans1[1][2])%m;
}
int main(){
	cin>>m>>a>>c>>x0>>n>>g;
	a=a%m,c=c%m,x0=x0%m;
	anss=mul(x0,qpow(a,n))%m;
	//cout<<anss<<endl;
	anss=(anss+mul(c,ksm(n))%m+m)%m;
	//cout<<(ksm(n))<<endl;
	cout<<anss%g;
	//cout<<"\n";
	//cout<<mul(1,-2);
	return 0;
} 
//递推公式Nx=(N0*a1^n+c*(a1^n-1 + a1^n-2 + ... + a1^0))mod m
2024/12/28 14:57
加载中...