大步小步(Baby Step,Giant Step,BSGS)算法,用来求解类似于 a x ≡ b ( m o d a^x≡b(mod ax≡b(mod p ) p) p)的问题,其中 a a a, b b b, p p p已经给出,本算法只能解决 p p p为素数的问题。
设 m = c e i l ( s q r t ( p ) ) m=ceil(sqrt(p)) m=ceil(sqrt(p)), x = i ∗ m − j x=i*m-j x=i∗m−j,则 a i ∗ m − j ≡ b ( m o d a^{i*m-j}≡b(mod ai∗m−j≡b(mod p ) p) p),同乘 a j a^j aj可得 ( a m ) i ≡ b ∗ a j ( m o d {(a^{m})}^{i}≡b*a^j(mod (am)i≡b∗aj(mod p ) p) p)。
接下来考虑枚举所有的 j ∈ [ 0 , m − 1 ] j ∈ [0,m-1] j∈[0,m−1],将 b ∗ a j b*a^j b∗aj m o d mod mod p p p加入哈希表(可用map)中,再枚举 i ∈ [ 0 , m ] i ∈ [0,m] i∈[0,m],计算出 ( a m ) i {(a^{m})}^{i} (am)i m o d mod mod p p p,在哈希表中找出对应的 j j j并更新答案,这样 x x x就可以算出了,方程的解也可以求出。
时间复杂度 O ( s q r t ( p ) ) O(sqrt(p)) O(sqrt(p)), 1 0 16 10^{16} 1016以下都没有问题。
例题:abc270g,