結果

問題 No.12 限定された素数
ユーザー H3PO4
提出日時 2023-02-19 22:15:03
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 176 ms / 5,000 ms
コード長 1,991 bytes
コンパイル時間 986 ms
コンパイル使用メモリ 79,540 KB
最終ジャッジ日時 2025-02-10 19:07:05
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 26
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<vector>

std::vector<int> primes(int n) {
    std::vector<bool> is_prime(n + 1, true);
    is_prime.at(0) = false;
    is_prime.at(1) = false;
    std::vector<int> res;
    for (int i = 2; i < n + 1; i++) {
        if (is_prime.at(i)) {
            res.push_back(i);
            for (int j = i * 2; j < n + 1; j += i) {
                is_prime.at(j) = false;
            }
        }
    }
    return res;
}

std::vector<int> digits(int x) {
    std::vector<int> res(10, 0);
    while (x > 0) {
        res.at(x % 10)++;
        x /= 10;
    }
    return res;
}

bool is_excess(std::vector<bool> A, std::vector<int> V) {
    for (int i = 0; i < 10; i++) {
        if ((!A.at(i)) && V.at(i) != 0) {
            return true;
        }
    }
    return false;
}

bool is_shortage(std::vector<bool> A, std::vector<int> V) {
    for (int i = 0; i < 10; i++) {
        if (A.at(i) && V.at(i) == 0) {
            return true;
        }
    }
    return false;
}

int main() {
    int N;
    std::cin >> N;
    std::vector<bool> A(10, false);
    for (int i = 0; i < N; i++) {
        int a;
        std::cin >> a;
        A.at(a) = true;
    }
    const int MAX = 5000000;
    const auto P = primes(MAX);
    std::vector<int> V(10, 0);
    int k_idx = 0;
    int ans = 0;

    for (int l_idx = 0; l_idx < P.size(); l_idx++) {
        const auto l_dig = digits(P.at(l_idx));
        for (int i = 0; i < 10; i++) {
            V.at(i) += l_dig.at(i);
        }
        while (is_excess(A, V)) {
            const auto k_dig = digits(P.at(k_idx));
            for (int i = 0; i < 10; i++) {
                V.at(i) -= k_dig.at(i);
            }
            k_idx++;
        }
        if (!is_shortage(A, V)) {
            int l = l_idx + 1 < P.size() ? P.at(l_idx + 1) - 1 : MAX;
            int k = k_idx - 1 >= 0 ? P.at(k_idx - 1) + 1 : 1;
            if (ans < l - k) { ans = l - k; }
        }

    }
    if (ans == 0) { ans = -1; }
    std::cout << ans << std::endl;
}
0