点击这里查看原题
点击这里查看扩展BSGS教程
扩展BSGS也可以拿来做普通BSGS哦
/*
User:Small
Language:C++
Problem No.:1467
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
ll a,b,c;
map<ll,ll> mp;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
ll pow(ll a,ll b,ll p){
ll res=1;
while(b){
if(b&1LL) res=(ll)res*a%p;
a=(ll)a*a%p;
b>>=1LL;
}
return res;
}
ll exbsgs(ll a,ll b,ll p){
if(b==1) return 0;
ll t,k=0,d=1;
while((t=gcd(a,p))!=1){
if(b%t) return -1;
k++;
b/=t;
p/=t;
d=d*(a/t)%p;
if(b==d) return k;
}
mp.clear();
ll m=ceil(sqrt(p)),mul=b,a_m=pow(a,m,p);
for(ll j=1;j<=m;j++){
mul=mul*a%p;
mp[mul]=j;
}
for(ll i=1;i<=m;i++){
d=d*a_m%p;
if(mp[d]) return i*m-mp[d]+k;
}
return -1;
}
int main(){
freopen("data.in","r",stdin);//
while(scanf("%lld%lld%lld",&a,&c,&b)&&a+b+c){
ll ans=exbsgs(a,b,c);
if(ans!=-1) printf("%lld\n",ans);
else printf("No Solution\n");
}
return 0;
}