「题解」hdu 1395 2^x mod n = 1
题目
求最小的 \(x>0\) 使得 \(2^x \equiv 1(\bmod n)\)。
思路
当 \(n=1\) 时,任何数模 \(1\) 都是零,不符合条件。
当 \(n\) 是偶数时,因为 \(2^x\) 为偶数,所以不符合条件。
当 \(n\) 不是 \(1\) 也不是偶数的时,\(2\) 和 \(n\) 互质,根据欧拉定理 \(2^{\varphi(n)}\equiv1(\bmod n)\),所以 \(\varphi(n)\) 一定是符合条件的,但是不一定是最小的,从 \(1\sim\varphi(n)\) 枚举找到最小的符合条件的。
Code
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
int n, pn;
int euler_phi(int x) {
int ans = x, sqrn = (int)sqrt(x * 1.0 + 0.5);
for (int i = 2; i <= sqrn; ++i) {
if (x % i == 0) {
ans = ans / i * (i - 1);
while (x % i == 0) x /= i;
}
}
if (x > 1) ans = ans / x * (x - 1);
return ans;
}
int qpow(int b) {
int ans = 1, base = 2;
while (b) {
if (b & 1) ans = 1ll * ans * base % n;
base = 1ll * base * base % n;
b >>= 1;
}
return ans % n;
}
int main() {
while (scanf("%d", &n) != EOF && n) {
if (!(n & 1) || n == 1) {
printf("2^? mod %d = 1\n", n);
}
else {
pn = euler_phi(n);
for (int i = 1; i <= pn; ++i) {
if (qpow(i) == 1) {
printf("2^%d mod %d = 1\n", i, n);
break;
}
}
}
}
return 0;
}

浙公网安备 33010602011771号