版权声明:By MrBird https://blog.csdn.net/MrBird_to_fly/article/details/82777479
题目描述
求方程A^X=B%C的最小非负整数解,这里的C不一定是素数。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//A^X=B%C
unordered_map<ll,int>mp;
ll exbsgs(ll a,ll b,ll c){
if(c==1)return 0;
ll d=1,cnt=0;
a%=c,b%=c;
ll mul=1;
for(ll i=1;i<=50;i++){
mul=mul*a%c;
if(mul==b)return i;
}
while(__gcd(a,c)!=1){
ll g=__gcd(a,c);
if(b%g)return -1;
cnt++;
b/=g,c/=g;
d=a/g*d%c;
}
ll m=ceil(sqrt(c));
mp.clear();
//i*m-j
mul=1;
for(ll j=1;j<=m;j++){
mul=mul*a%c;
mp[mul*b%c]=j;
}
for(ll i=1;i<=m;i++){
d=d*mul%c;
if(mp.find(d)!=mp.end()){
return i*m-mp[d]+cnt;
}
}
return -1;
}
int main(){
ll a,b,c;
while(~scanf("%lld%lld%lld",&a,&c,&b)){
if(a==0&&b==0&&c==0)break;
ll ans=exbsgs(a,b,c);
if(ans==-1)printf("No Solution\n");
else printf("%lld\n",ans);
}
}