#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){ x=x*10+ch-'0';ch=getchar(); }
return x*f;
}
int a,p,b;
map<int,int> vis;
inline int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
inline int exgcd(int a,int b,int &x,int &y){
if(!b)x=1,y=0;
else {
exgcd(b,a%b,x,y);
int t=x;x=y;
y=t-a/b*y;
}
}
inline int inv(int a,int b){
int x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
inline int Qow(int a,int b,int p){
int ans=1;
while(b){
if(b&1) ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
inline int BSGS(int a,int b,int p){
vis.clear();
int m=ceil(sqrt(p));b%=p;
for(int i=1;i<=m;++i)
b=b*a%p,vis[b]=i;
int tmp=Qow(a,m,p);
b=1;
for(int i=1;i<=m;++i){
b=b*tmp%p;
if(vis[b])return (i*m-vis[b]+p)%p;
}
return -1;
}
inline int EX_bsgs(int a,int b,int p){
if(b==1||p==1)return 0;
int g=gcd(a,p),k=0,v=1;
while(g>1){
if(b%g!=0)return -1;
k++;b/=g;p/=g;v=v*(a/g)%p;
if(v==b)return k;
g=gcd(a,p);
}
int t=BSGS(a,b*inv(v,p)%p,p);
if(t==-1)return -1;
return t+k;
}
signed main(){
a=read();p=read();b=read();
while(a&&b&&p){
a%=p;b%=p;
int t=EX_bsgs(a,b,p);
if(t==-1)printf("No Solution\n");
else printf("%lld\n",t);
a=read();p=read();b=read();
}
return 0;
}
帮帮忙吧,跳闸了qwq