离散对数问题
有一类问题形式如下:
给定同余方程 a x ≡ b ( m o d m ) a^x\equiv b\quad(\mod m) ax≡b(modm) ,求其最小解。
这样的方程解起来并不简单,最暴力的想法自然是一个一个试,于是对于这类“不可做”问题考虑分块的做法。下面我们将分两种情况讨论:
( a , m ) = 1 (a,m)=1 (a,m)=1
a a a 和 m m m 互质的情况下问题就比较好处理了。
设 x = A m + B x=A\sqrt m+B x=Am +B
则原来方程可化为:
a A m + B ≡ b ( m o d m ) ⟹ a B ≡ b a − A m ( m o d m ) \begin{aligned} a^{A\sqrt m +B}&\equiv b\quad(\mod m)\\ \implies a^B&\equiv ba^{-A\sqrt m}\quad(\mod m) \end{aligned} aAm +B⟹aB≡b(modm)≡ba−Am (modm)
于是我们把 a B a^B aB 存入哈希表中,然后 O ( n ) O(\sqrt n) O(n ) 找到 A A A 的取值。
Discrete Logging
#include
#include
#include
#include
[SDOI2011] 计算器
#include
#include
#include
#include
( a , m ) ≠ 1 (a,m)\neq1 (a,m)=1
我们既然已经有了 a a a 和 m m m 互质情况下的做法,那只需要将 a a a 和 m m m 化为互质的即可。
对于 a x ≡ b ( m o d m ) a^x\equiv b\quad(\mod m) ax≡b(modm) 设 ( a , m ) = g (a,m)=g (a,m)=g
如果 g ∤ b g\not\mid b g∣b 那么无解。
如果 g ∣ b g\mid b g∣b 那么原方程可化为 ( a ′ g ) x ≡ b ′ g ( m o d m ′ g ) (a'g)^x\equiv b'g\quad(\mod m'g) (a′g)x≡b′g(modm′g)
同余式两边同除以 g g g 得: ( a ′ ) x − 1 ≡ b ′ ( a ′ ) − 1 ( m o d m ′ ) (a')^{x-1}\equiv b'(a')^{-1}\quad(\mod m') (a′)x−1≡b′(a′)−1(modm′)
注意每次新的 x x x 都是原来的 x − 1 x-1 x−1 ,故需要记录操作次数 c n t cnt cnt
如果 b ′ ( a ′ ) − 1 ≡ 1 ( m o d m ′ ) b'(a')^{-1}\equiv1\quad(\mod m') b′(a′)−1≡1(modm′) 或 m ′ = 1 m'=1 m′=1 则解为 c n t cnt cnt
不断执行上述操作,直至 ( a , m ) = 1 (a,m)=1 (a,m)=1
注意特判 a ≡ 0 ( m o d m ) a\equiv0\quad(\mod m) a≡0(modm) 时的情况
[SPOJ] Mod
#include
#include
#include