如何让exBSGS做出的答案不为0?
查看原帖
如何让exBSGS做出的答案不为0?
832111
lidagua1004楼主2024/5/9 13:40

求调代码

#include<bits/stdc++.h>
#define int __int128
using namespace std;
map<int,int> mp;

int read(){
	int s=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){s=(s<<3)+(s<<1)+ch-48;ch=getchar();}
	return s*f;
}
void write(int x) {
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}
int gcd(int a,int b){
    if (!b)return a;
    return gcd(b,a%b);
}
void exgcd(int a,int b,int &x,int &y){
	if(!b)x=1,y=0;
	else{
		exgcd(b,a%b,x,y);
		int t=x;
		x=y;
		y=t-a/b*y;
	}
}
int inv(int a,int b){
	int x,y;
	exgcd(a,b,x,y);
	return (x%b+b)%b;
}
int qpow(int a,int b,int p){
	int ans=1,base=a;
	while(b){
		if(b&1) ans=ans*base%p;
		base=base*base%p;
		b>>=1;
	}
	return ans%p;
}
int bsgs(int a,int b,int p){
	mp.clear();
	long double kkksc03=(p);
	int k=ceil(sqrt(kkksc03));
	b%=p;
	for(int i=1;i<=k;i++) b=b*a%p,mp[b]=i;
	a=qpow(a,k,p),b=1;
	for(int A=1;A<=k;A++){
		b=b*a%p;
		if(mp[b]) return (A*k-mp[b]+p)%p;
	}
    return -1;
}
int exbsgs(int a,int b,int p){
	if(b==1||p==1) return 0;
	int g=gcd(a,p),k=0,no=1;
	while(g>1){
		if(b%g) return -1;
		k++,b/=g,p/=g,no=no*(a/g)%p;
		if(no==b) return k;
		g=gcd(a,p);
	}
	int f=bsgs(a,b*inv(no,p)%p,p);
	if(f==-1) return -1;
	return f+k;
}
signed main(){
	
	return 0;
}
2024/5/9 13:40
加载中...