#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ld long double
#define ll long long
#define int long long
#define ull unsigned long long
#define N 100003
#define M number
using namespace std;
const int INF=0x3f3f3f3f;
inline int Min(int a,int b){
return a>b?b:a;
}
inline ll read(){
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct HASH{
static const int mod=100003;
int a[N+2],b[N+2];
inline HASH(){
memset(a,-1,sizeof(a));
}
inline int h(int x){
return x%mod;
}
inline int find(int x){
int w=h(x);
while(a[w]!=-1&&a[w]!=x){
w++;
if(w==mod) w=0;
}
return w;
}
inline bool insert(int x,int ci){
int w=find(x);
if(a[w]==x) return 0;
a[w]=x;b[w]=ci;
return 1;
}
inline bool ask(int x,int &ci){
int w=find(x);
if(a[w]==-1) return 0;
ci=b[w];
return 1;
}
};
HASH ha;
int p,b,n,ans=INF;
inline int ksm(int a,int b,int mod){
int res=1;
while(b){
if(b&1) (res*=a)%=mod;
a=a*a%mod;
b>>=1;
}
return res;
}
signed main(){
p=read();b=read()%p;n=read()%p;
if(p==2&&(b^n)==0){
printf("1\n");
return 0;
}
int m=ceil(sqrt(p));
for(int i=0;i<=m+1;i++){
ha.insert(ksm(b,i,p)*n%p,i);
// printf("i:%d in hash:%d\n",i,ksm(b,i,p)*n%p);
}
// printf("m:%d\n",m);
for(int i=0;i<=m+1;i++){
int ci;
// printf("ksm:%d\n",ksm(b,(i*m)%(p-1),p));
if(ha.ask(ksm(b,(i*m)%(p-1),p),ci)){
// printf("ci:%d\n",ci);
// printf("allci:%d\n",((i*m)%(p-1)+p-1-ci)%(p-1));
// printf("i:%d\n",i);
ans=Min(ans,((i*m%(p-1)-ci)%(p-1)+p-1)%(p-1));
}
}
if(ans!=INF) printf("%lld\n",ans);
else printf("no solution\n");
return 0;
}
/*
2 86922 75600
2 51142 85460
*/