一个关于bsgs的小问题
查看原帖
一个关于bsgs的小问题
757101
junee楼主2024/4/29 09:33
#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#include<cmath>
using namespace std;
typedef long long LL;
LL a,b,p;
LL qmi(LL a,LL k){
	LL res=1;
	while(k){
		if(k&1)res=res*a%p;
		k>>=1;
		a=a*a%p;
	}
	return res;
}
unordered_map<LL,LL>m;
LL bsgs(){
	a%=p,b%=p;
	if(b==1)return 0;
	LL n=ceil(sqrt(p));
	for(int j=0;j<=n;j++){
		m[b*qmi(a,j)%p]=j;
	}
	for(int i=1;i<=n;i++){
		if(m[qmi(a,n*i)%p])return i*n-m[qmi(a,n*i)];
	}
	return -1;
}
int main(){
	cin>>p>>a>>b;
	m.clear();
	LL ans=bsgs();
	if(ans>=0)cout<<ans;
	else cout<<"no solution";
	return 0;
}

在枚举 b×ajb \times a^j 时, j 的范围应该是 [0,m−1]\left[0,m-1 \right] ,但是在这份代码中, j 必须枚举到m才行,为什么呢

2024/4/29 09:33
加载中...