「题解」hdu 1395 2^x mod n = 1

题目

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;
}
posted @ 2020-10-18 20:14  yu__xuan  阅读(111)  评论(0)    收藏  举报