64分求助
查看原帖
64分求助
754673
Jackson_Miller楼主2024/1/24 16:50

应该是BSGS的问题,但直接套AC的模板,不知为何还WA

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,p,y,z;
unordered_map<int,int>hsh;
int ksm(int a,int b,int p){
	int sum=1;
	while(b){
		if(b&1) sum=sum*a%p;
		a=a*a%p;
		b>>=1;
	}
	return sum;
}
int BSGS(int a,int b,int p){
	int m=sqrt(p)+1;
	b%=p;
	for(int i=0;i<m;i++){
		int fp=ksm(a,i,p);
		hsh[b*fp%p]=i;
	}
	a=ksm(a,m,p);
	if(a==0){
		if(b==0){
			return 1;
		}else{
			return -1;
		}
	}
	for(int i=1;i<=m;i++){
		int fp=ksm(a,i,p);
		if(hsh.count(fp)>0){
			if(i*m-hsh[fp]){
				return i*m-hsh[fp];
			}
		}
	}
	return -1;
}
long long exgcd(long long a,long long b,long long &x1,long long &y2){
	if(b==0){
		x1=1,y2=0;
		return a;
	}
	long long d=exgcd(b,a%b,x1,y2);
	long long z=x1;x1=y2;y2=z-y2*(a/b);
	return d;
}
signed main(){
	int  t,op;
	cin>>t>>op;
	while(t--){
		int p,a,b;
		cin>>a>>b>>p;
		if(op==1){
			cout<<ksm(a,b,p)<<endl;
		}
		if(op==2){
			long long x=0,yy=0,gcd=0;
			gcd=exgcd(a,p,x,yy);	
			if(b%gcd==0){
				long long tmp=p/gcd;
				x=(((x*b)/gcd)%tmp+tmp)%tmp;
				printf("%lld\n",x);
			}
			else{
				printf("Orz, I cannot find x!\n");
			}	
		}
		if(op==3){
			if(a%p==0&&b%p!=0){
				cout<<"Orz, I cannot find x!\n";
				continue;
			}
			if(BSGS(a,b,p)==-1){
				cout<<"Orz, I cannot find x!";
			}
			else{
				cout<<BSGS(a,b,p)%(p-1)<<endl;
			}
		}
	}
	return 0;
} 
2024/1/24 16:50
加载中...