Description
给定
A,B
,求最小的
x
,满足
Solution
BSGS 裸题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int A, B, P, Ans;
map<int, int> ap;
inline int Pow(int a, int b) {
int c = 1;
while (b) {
if (b & 1) c = (ll)c * a % P;
a = (ll)a * a % P; b >>= 1;
}
return c;
}
inline int Inv(int a, int P) {
return Pow(a, P - 2);
}
int Log(int a, int b, int p) {
int m = ceil(sqrt(p)), ia = Inv(Pow(a, m), P), res;
res = Inv(b, p);
for (int i = 0; i < m; i++) {
if (!ap.count(res)) ap[res] = i;
res = (ll)res * a % P;
}
res = 1;
for (int i = 0; i <= m; i++) {
if (ap.count(res)) return ap[res] + i * m;
res = (ll)res * ia % P;
}
return -1;
}
int main(void) {
while (~scanf("%d%d%d", &P, &A, &B)) {
ap.clear();
Ans = Log(A, B, P);
if (Ans == -1) puts("no solution");
else printf("%d\n", Ans);
}
}