Nugine 的个人博客关于

HDU-1395 2^x mod n = 1

题目:2^x mod n = 1

解法1: 暴力

xx 从 11 取起,挨个算一下,第一个满足要求的 xx 就是 ansans.

为了避免溢出,需要用乘法取模。

(a⋅b)(a \cdot b) ≡((amod  m)⋅(bmod  m)),  \equiv ((a \mod m)\cdot (b \mod m)),\; (mod  m)(\mod m)

解法2: 欧拉定理

概念: 阶

设 n>1n > 1 且 a,na, n 互质,则有最小的正整数 tt, 使得

atmod  n=1a ^ t \mod n = 1

此时称 tt 为 aa 对模 nn 的阶,记为 t=Ordn(a)t=\mathrm{Ord}_n(a).

概念: 原根

由欧拉定理可知 Ordn(a)<=ϕ(n)\mathrm{Ord}_n(a) <= \phi(n).

当 Ordn(a)=ϕ(n)\mathrm{Ord}_n(a) = \phi(n) 时,称 aa 是模 nn 意义下 nn 的一个原根.

分析

因为要有解, 所以 nn 必须是大于 11 的奇数.

可得 ans=Ordm(2)ans = \mathrm{Ord}_m(2), ansans 的上界为 ϕ(m)\phi(m).

因为

2Ordm(2)mod  m=1,  (阶的定义)2ϕ(m)mod  m=1,  (欧拉定理)\begin{aligned} 2 ^ {\mathrm{Ord}_m(2)} &\mod m = 1,\;(\text{阶的定义})\\ 2 ^ {\phi(m)} &\mod m = 1,\;(\text{欧拉定理})\\ \end{aligned}Ordm(2)≤ϕ(m)\mathrm{Ord}_m(2) \le \phi(m)

所以

Ordm(2)  ∣  ϕ(m)\mathrm{Ord}_m(2)\;|\;\phi(m)

所以 ansans 是 ϕ(m)\phi(m) 的因子.

先计算 ϕ(m)\phi(m),然后枚举因子,最小的满足条件的因子就是 ansans.

代码

解法1: mod.1.cpp

解法2: mod.2.cpp

发布于 2019-02-01地址: GitHub