传送门
BSGS模板
Code:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#define ll long long
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
const int mod=233333;
namespace BSGS{
int hash[mod],head[mod],nxt[mod],vis[mod],tot=0;
inline void add(int x,int y){hash[++tot]=x,vis[tot]=y;nxt[tot]=head[x%mod];head[x%mod]=tot;}
inline int fin(int x){for(int i=head[x%mod];i;i=nxt[i]) if(hash[i]==x) return vis[i]; return -1;}
inline int work(int a,int b,int n){
memset(head,0,sizeof(head));
tot=0;
if(b==1) return 0;
int m=sqrt(n),j;
ll x=1,p=1;
for(int i=0;i<m;i++){
add(p*b%n,i);
p=p*a%n;
}
for(ll i=m;;i+=m){
if((j=fin(x=x*p%n))!=-1) return i-j;
if(i>n) break;
}
return -1;
}
}
using namespace BSGS;
int main(){
int a,b,n;
while(~scanf("%d%d%d",&n,&a,&b)){
int ans=work(a,b,n);
if(ans==-1) puts("no solution");
else cout<<ans<<"\n";
}
return 0;
}