Nugine 的个人博客关于

HDU-1395 2^x mod n = 1

题目:2^x mod n = 1

解法1: 暴力

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

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

(ab)(a \cdot b) ((amodm)(bmodm)),  \equiv ((a \mod m)\cdot (b \mod m)),\; (modm)(\mod m)

解法2: 欧拉定理

概念:

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

atmodn=1a ^ t \mod n = 1

此时称 ttaa 对模 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)modm=1,  (阶的定义)2ϕ(m)modm=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