#45992: cpp ans


1121232@stu.wghs.tp.edu.tw (Ian911436)

學校 : 臺北市私立薇閣高級中學
編號 : 258883
來源 : [60.248.154.143]
最後登入時間 :
2025-05-14 15:36:23
d709. 判断质数(一) -- 判断质数系列 | From: [60.248.154.143] | 發表日期 : 2025-05-07 15:59

#include <iostream>
#include <bitset>
using namespace std;
using u64 = uint64_t;
using u128 = __uint128_t;

const int MAX = 100000;
bitset<MAX + 1> is_not_prime;

void sieve() {
    is_not_prime[0] = is_not_prime[1] = true;
    for (int i = 2; i * i <= MAX; ++i) {
        if (!is_not_prime[i]) {
            for (int j = i * i; j <= MAX; j += i)
                is_not_prime[j] = true;
        }
    }
}

u64 power(u64 a, u64 b, u64 mod) {
    u64 res = 1;
    a %= mod;
    while (b) {
        if (b & 1) res = (u128)res * a % mod;
        a = (u128)a * a % mod;
        b >>= 1;
    }
    return res;
}

bool miller_rabin(u64 n, u64 a) {
    if (n % a == 0) return false;
    u64 d = n - 1;
    while (d % 2 == 0) {
        u64 x = power(a, d, n);
        if (x == n - 1) return true;
        if (x != 1) return false;
        d /= 2;
    }
    u64 x = power(a, d, n);
    return x == 1 || x == n - 1;
}

bool is_prime(u64 n) {
    if (n <= MAX) return !is_not_prime[n];
    if (n % 2 == 0 || n < 2) return false;
    u64 bases[] = {2, 3};
    for (u64 a : bases) {
        if (n == a) continue;
        if (!miller_rabin(n, a)) return false;
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    sieve();  // 預處理小質數

    int n;
    while (cin >> n && n != 0) {
        cout << (is_prime(n) ? 0 : 1) << '\n';
    }
}

 
ZeroJudge Forum