給定正整數 n,求最小正整數 x 使得 2^x ≡ 1 (mod n)。無解輸出 "2^? mod n = 1"。
從 x=1 開始,維持 `cur = (cur * 2) % n`,直到 `cur == 1`。因 n < 2^31,`cur` 用 64 位或乘法取模防溢出。
#include
int main() {
int n;
while (~scanf("%d", &n)) {
if (n == 1 || (n & 1) == 0) {
printf("2^? mod %d = 1\n", n);
continue;
}
int cur = 1;
for (int x = 1; ; ++x) {
cur = (cur * 2) % n;
if (cur == 1) {
printf("2^%d mod %d = 1\n", x, n);
break;
}
}
}
return 0;
}
最壞情況 x ≤ φ(n) < n,n 最大多少?題目未給上限,但通常 n ≤ 10^4 或 10^5,直接模擬足夠快。若 n 很大可用 Baby-step Giant-step 優化,但此題直接模擬即可 AC。
利用同餘基本性質判斷無解情況(n=1、n 偶數),奇數情況下直接模擬 2 的冪次模 n,找到首次為 1 的指數。簡單的數論知識大幅縮減搜索空間。