UVA10225

思路

因为题目中给定的 \(b\)\(p\) 一定互质,所以直接用普通的 BSGS 即可。我们首先可以发现答案一定在 \(1\sim p\) 之间,所以我们考虑将 \(1\sim p\) 分块处理,首先我们将他们分成 \(\sqrt q\) 块,然后我们设答案为 \(a^{i\times len-m}\) 那么我们就可以得到 \(a^{i\times len}\bmod p=b\times a^m\bmod p\) 所有我们可以处理出所有的 \(a^m\times b\bmod p\) 然后再枚举一下 \(i\) 看是否满足条件即可。

代码

#include <bits/stdc++.h>
using namespace std ;
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define rep1(i,x,y) for(int i=x;i>=y;i--)
#define fire signed
#define kong putchar(' ')
#define in(x) scanf("%lld",&x)
#define lcm(x,y) x*y/__gcd(x,y)
#define il inline
il void print(int x) {
	if(x>=10) print(x/10);
	putchar(x%10+'0');
}
int a,b,p;
int qmi(int a,int b,int q) {
	int res=1;
	while(b) {
		if(b&1) res=res*a%q;
		a=a*a%q;
		b>>=1;
	}return res;
}
int bsgs(int a,int b,int p) {
	unordered_map<int,int>mp;
	a%=p,b%=p;
	int len=sqrt(p-1)+1;
	rep(i,0,len) mp[b]=i,b=b*a%p;//预处理
	int s=a=qmi(a,len,p);
	rep(i,1,len) {
		if(mp[s]) return i*len-mp[s];//找到了
		s=a*s%p;//继续递归
	} return -1;
}
fire main() {
	while(cin>>p>>a>>b) {
	int res=bsgs(a,b,p);
	if(res==-1) cout<<"no solution"<<endl;
	else cout<<res<<endl;
}
	return false;
}
posted @ 2024-01-31 11:35  highkj  阅读(1)  评论(0)    收藏  举报