POJ2417 Discrete Logging && BSGS模板

传送机

计算满足$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 }
BSGS
 

猜你喜欢

转载自www.cnblogs.com/Shine-Sky/p/9651128.html