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;
}

浙公网安备 33010602011771号