RT,#11 WA on line 13258 column 1, read N, expected 3.
代码:
#include <iostream>
#include <map>
#include <cmath>
using namespace std;
typedef long long ll;
map<ll, int> mp;
inline ll quick_pow(ll x, ll p, ll mod){
ll ans = 1;
while (p){
if (p & 1) ans = ans * x % mod;
x = x * x % mod;
p >>= 1;
}
return ans;
}
inline int bsgs(int a, ll b, int p){
if (p == 1) return 0;
a %= p;
b %= p;
if (a == 0) return b <= 1 ? 0 : -1;
if (b == 0) return -1;
if (b == 1) return 0;
int m = ceil(sqrt(p)), i = 0;
ll t = quick_pow(a, m, p) % p;
mp.clear();
for (register ll j = b; i <= m; i++, j = j * a % p){
mp[j] = i;
}
i = 1;
for (register ll j = t; i <= m; i++, j = j * t % p){
if (mp.count(j)) return i * m - mp[j];
}
return -1;
}
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
void exgcd(ll a, ll b, ll &x, ll &y){
if (b == 0){
x = 1;
y = 0;
return;
}
ll t;
exgcd(b, a % b, x, y);
t = x;
x = y;
y = t - a / b * y;
}
inline ll inv(ll a, ll b){
ll x, y;
exgcd(a, b, x, y);
return (x % b + b) % b;
}
inline int exbsgs(int a, int b, int p){
if (p == 1) return 0;
a %= p;
b %= p;
if (b == 1) return 0;
int x = 0, t, ans;
ll y = 1;
while ((t = gcd(a, p)) != 1){
if (b % t != 0) return -1;
b /= t;
x++;
y = y * (a / t) % p;
if (b == y) return x;
p /= t;
}
ans = bsgs(a, b * inv(y, p) % p, p);
if (ans == -1) return -1;
return ans + x;
}
int main(){
while (true){
int a, p, b, ans;
cin >> a >> p >> b;
if (a == 0 && p == 0 && b == 0) break;
ans = exbsgs(a, b, p);
if (ans == -1){
cout << "No Solution" << endl;
} else {
cout << ans << endl;
}
}
return 0;
}