计算满足$A^x \equiv B(mod\ C)$的最小非负整数$x$。
BSGS模板题
BSGS:
设$m=\sqrt C$,假设$x=i*m+j$。
$A^{i \times m} \equiv A^j \times B (mod\ C)$
于是预处理所有的$B*A^j$,再枚举$i$去匹配即可复杂度$O(\sqrt C)$
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <map> 6 #include <cmath> 7 #define inc(i) (++ (i)) 8 #define dec(i) (-- (i)) 9 #define int long long 10 using namespace std; 11 12 int A , B , C , x , m , Now; 13 bool flag; 14 map <int , int> M; 15 16 inline int KSM(int x , int p) 17 { 18 int Ans = 1; 19 while(p) 20 { 21 if(p & 1) Ans = 1ll * Ans * x % C; 22 x = 1ll * x * x % C , p >>= 1; 23 } 24 return Ans; 25 } 26 27 signed main() 28 { 29 while(~scanf("%lld%lld%lld" , &C , &A , &B)) 30 { 31 M.clear() , flag = 1; 32 m = (int)ceil(sqrt(1.0 * C)); 33 Now = B % C , M[Now] = 0; 34 for(int i = 1 ; i <= m ; inc(i)) 35 { 36 Now = 1ll * Now * A % C; 37 M[Now] = i; 38 } 39 A = KSM(A , m) , Now = 1; 40 for(int i = 1 ; i <= m ; inc(i)) 41 { 42 Now = 1ll * Now * A % C; 43 if(M[Now]) 44 { 45 flag = 0; 46 printf("%lld\n" , i * m - M[Now]); 47 break; 48 } 49 } 50 if(flag) puts("no solution"); 51 } 52 return 0; 53 }