模板
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int HashMod = 191981;
long long a, b, p;
struct HashTable {
struct Line {int u, v, next;} e[100000];
int h[HashMod], cnt;
void add(int u, int v, int w) {e[++ cnt] = (Line){w, v, h[u]}; h[u] = cnt;}
void clear() {memset(h, 0, sizeof(h)); cnt = 0;}
void insert(int x, int i) {
int k = x % HashMod;
add(k, i, x);
}
int query(int x) {
for(int i = h[x % HashMod]; i; i = e[i].next)
if(e[i].u == x) return e[i].v;
return -1;
}
} hs;
long long gcd (long long a, long long b) {
return !b ? a : gcd(b, a % b);
}
long long exgcd (long long a, long long b, long long &x, long long &y) {
if (!b) {
x = 1;
y = 0;
return a;
}
long long d = exgcd(b, a % b, x, y), z;
z = x;
x = y;
y = z - a / b * y;
return d;
}
long long inv (long long a, long long b) {
long long x, y;
exgcd(a, b, x, y);
return (x % b + b) % b;
}
long long BSGS (long long a, long long b, long long p) {
long long s = sqrt(p) + 1, r = 1, sr = 1;
hs.clear();
for (int i = 0; i < s; i ++) {
hs.insert(r * b % p, i);
r = r * a % p;
}
sr = r;
for (int i = 1; i <= s; i ++) {
int q = hs.query(sr);
if (q != -1) return s * i - q;
sr = sr * r % p;
}
return -1;
}
long long exBSGS (long long x, long long y, long long p) {
if (y == 1 || p == 1) return 0;
long long g = gcd(x, p), k = 0, nx = 1, res;
while (g > 1) {
if (y % g) return -1;
k ++;
y /= g;
p /= g;
nx = nx * (x / g) % p;
if (nx == y) return k;
g = gcd(x, p);
}
res = BSGS(x, y * inv(nx, p) % p, p);
if (res == -1) return -1;
else return res + k;
}
int main () {
scanf("%lld%lld%lld", &a, &p, &b);
while (a || p || b) {
a %= p;
b %= p;
long long res = exBSGS(a, b, p);
if (res == -1) printf("No Solution\n");
else printf("%lld\n", res);
scanf("%lld%lld%lld", &a, &p, &b);
}
return 0;
}