给定A,B,P 求 x使得 , 而 P 不一定是质数
我们令 于是有
如果A, P/d 仍然不互质, 我们继续取d, 最后有
于是直接BSGS就可以了, 最后记得将答案加上t
void exBSGS(int a, int b){
if(b == 1){ printf("0\n"); return;}
int d = gcd(a, p); LL k = 1; int t = 0;
while(d != 1){
if(b % d){ printf("No Solution\n"); return;}
++t; b /= d; p /= d; k = (k * (LL)(a/d)) % p;
if(b == k){ printf("%d\n", t); return;}
d = gcd(a, p);
}
M.clear();
LL s = b, m = sqrt(p) + 1;
for(int i=0; i<m; i++){
M[s] = i; s = (s * a) % p;
}
LL res = power(a, m);
s = k;
for(int i=1; i<=m; i++){
s = (s * res) % p;
if(M[s]){ printf("%d\n", i*m - M[s] + t); return;}
}
printf("No Solution\n");
}