Submission details
Task:Alkuluvut
Sender:jhuun
Submission time:2025-09-28 00:08:12 +0300
Language:C++ (C++20)
Status:READY
Result:17
Feedback
groupverdictscore
#1ACCEPTED17
#20
#30
Test results
testverdicttimegroup
#1ACCEPTED0.05 s1, 2, 3details
#20.38 s2, 3details
#30.32 s3details

Code

#include <bits/stdc++.h>

constexpr auto L = 1e6;
using i128 = __int128_t;
 
std::vector<int64_t> P = []() {
    std::vector<int64_t> p(L + 1, true);
    p[0] = p[1] = false;
    for (int64_t i = 2; i <= L; ++i) {
        if (p[i]) {
            for (int64_t j = i * i; j <= L; j += i) {
                p[j] = false;
            }
        }
    }
    return p;
}();
 
i128 m_pow(i128 b, i128 exp, i128 m) {
    i128 res = 1;
    b %= m;
    while (exp) {
        if (exp & 1) {
            (res *= b) %= m;
        }
        (b *= b) %= m;
        exp >>= 1;
    }
    return res;
}
 
bool mr_check(i128 n, i128 p, i128 d, int s) {
    auto x = m_pow(p, d, n);
    if (x == 1 || x == n - 1) {
        return false;
    }
    for (auto r = 1; r < s; ++r) {
        (x *= x) %= n;
        if (x == n - 1) {
            return false;
        }
    }
    return true;
}
 
bool is_prime(int64_t x) {
    if (x <= L) {
        return P[x];
    }
    auto r = 0;
    auto d = x - 1;
    while ((d & 1) == 0) {
        d >>= 1;
        r++;
    }
    for (const auto p : {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37}) {
        if (mr_check(x, p, d, r)) {
            return false;
        }
    }
    return true;
}

bool sample(const std::vector<int64_t>& N, int64_t& x, std::size_t idx) {
    if (idx > 16) {
        return false;
    }
    static std::random_device rd;
    static std::mt19937 gen(rd());
    std::uniform_int_distribution<> d(0, N.size() - 1);
    std::uniform_int_distribution<> d2(1, idx);
    const int64_t ri = d(gen);
    const int64_t rp = d2(gen);
    if (N[ri] == 0 && rp == static_cast<int64_t>(idx)) return sample(N, x, idx);
    const int64_t m = std::pow(10, rp);
    x = (x / m) * (m * 10) + N[ri] * m + (x % m);
    if (is_prime(x)) {
        return true;
    }
    return sample(N, x, idx + 1);
}

void ok(const std::vector<int64_t>& N, std::vector<bool>& used, std::size_t idx, int64_t m, int64_t x, bool& k) {
    if (idx == N.size()) {
        if (k = is_prime(x); k) {
            std::cout << "YES\n" << x << '\n';
        } else {
            for (int i = 0; !k && i < 1000; ++i) {
                int64_t x2 = x;
                if (k = sample(N, x2, idx); k) {
                    std::cout << "YES\n" << x2 << '\n';
                }
            }
        }
        return;
    }
    for (std::size_t i = 0; i < N.size(); ++i) {
        if (m == 1 && (N[i] % 2 == 0 || N[i] == 5)) {
            continue;
        }
        if (!used[i]) {
            used[i] = true;
            ok(N, used, idx + 1, m * 10, m * N[i] + x, k);
            if (k) return;
            used[i] = false;
        }
    }
    if ((k = (N.size() == 1 && (N.back() == 2 || N.back() == 5)))) {
        std::cout << "YES\n" << N.back() << "\n";
    }
}

int main() {
    int t;
    std::cin >> t;
    for (int i = 0, k; i < t; ++i) {
        std::cin >> k;
        std::vector<int64_t> N(k);
        for (auto& n : N) {
            std::cin >> n;
        }
        bool test = false;
        for (const auto n : N) {
            test = (n == 1 || n == 2 || n == 3 || n == 5 || n == 7 || n == 9);
        }
        if (!test) {
            std::cout << "NO\n";
            continue;
        }
        std::vector<bool> used(N.size());
        if (bool k = false; ok(N, used, 0, 1, 0, k), !k) {
            std::cout << "NO\n";
        }
    }
}

Test details

Test 1

Group: 1, 2, 3

Verdict: ACCEPTED

input
10
1
0
1
1
...

correct output
NO
YES
11
YES
2
...

user output
NO
YES
11
YES
2
...

Test 2

Group: 2, 3

Verdict:

input
175
1
0
1
1
...

correct output
NO
YES
11
YES
2
...

user output
NO
YES
11
YES
2
...

Test 3

Group: 3

Verdict:

input
848
4
0 1 2 3
4
0 1 2 4
...

correct output
YES
10223
YES
4021
YES
...

user output
YES
3202301
NO
NO
NO
...