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

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章