| Task: | Alkuluvut |
| Sender: | jhuun |
| Submission time: | 2025-09-28 12:52:20 +0300 |
| Language: | C++ (C++20) |
| Status: | READY |
| Result: | 17 |
| group | verdict | score |
|---|---|---|
| #1 | ACCEPTED | 17 |
| #2 | WRONG ANSWER | 0 |
| #3 | WRONG ANSWER | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.02 s | 1, 2, 3 | details |
| #2 | WRONG ANSWER | 0.02 s | 2, 3 | details |
| #3 | ACCEPTED | 0.03 s | 3 | details |
Code
#include <bits/stdc++.h>
constexpr auto L = 1e6;
using i128 = __int128_t;
std::unordered_map<int64_t, int64_t> SOLVED;
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];
}
for (const auto p : {3, 5, 7, 11, 13}) {
if (x % p == 0) {
return false;
}
}
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;
}
void test2(const std::vector<int64_t>& N, int64_t x, std::size_t idx, std::size_t L, int64_t& x2, bool& ok) {
if (idx >= L) {
return;
}
static const std::vector<int64_t> POW = {
1LL, 10LL, 100LL, 1000LL, 10000LL, 100000LL, 1000000LL, 10000000LL, 100000000LL, 1000000000LL, 10000000000LL,
100000000000LL, 1000000000000LL, 10000000000000LL, 100000000000000LL, 1000000000000000LL, 10000000000000000LL
};
for (int64_t d : N) {
for (std::size_t p = 1; !ok && p <= idx; ++p) {
if (d == 0 && p == idx) {
continue;
}
const i128 m = POW[p];
const auto xn = (x / m) * (m * 10) + d * m + (x % m);
if (is_prime(xn)) {
ok = true;
x2 = xn;
return;
}
test2(N, xn, idx + 1, L, x2, ok);
}
if (ok) {
return;
}
}
return;
}
void test(const std::vector<int64_t>& N, std::vector<bool>& used, std::size_t idx, int64_t m, int64_t x, bool& ok) {
if (idx == N.size()) {
if (ok = is_prime(x); ok) {
std::cout << "YES\n" << x << '\n';
} else {
for (auto idx2 = idx; idx2 <= 16; ++idx2) {
int64_t x2{};
test2(N, x, idx, idx2, x2, ok);
if (ok) {
std::cout << "YES\n" << x2 << '\n';
return;
}
}
}
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;
test(N, used, idx + 1, m * 10, m * N[i] + x, ok);
if (ok) return;
used[i] = false;
}
}
}
bool check3(const std::vector<int64_t>& N) {
static const std::set<int64_t> g{1, 2, 4, 5, 7, 8};
for (const auto n : N) {
if (g.count(n)) {
return false;
}
}
return true;
}
bool init_test(const std::vector<int64_t>& N) {
if (N.size() == 1) {
switch (N.back()) {
case 1:
std::cout << "YES\n11\n";
break;
case 2:
case 3:
case 5:
case 7:
std::cout << "YES\n" + std::to_string(N.back()) + "\n";
break;
default:
std::cout << "NO\n";
}
return true;
}
if (check3(N)) {
std::cout << "NO\n";
return true;
}
static const std::set<int64_t> g{1, 3, 7, 9};
for (const auto n : N) {
if (g.count(n)) {
return false;
}
}
std::cout << "NO\n";
return true;
}
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;
}
if (!init_test(N)) {
std::vector<bool> used(N.size());
if (bool ok = false; test(N, used, 0, 1, 0, ok), !ok) {
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: WRONG ANSWER
| input |
|---|
| 175 1 0 1 1 ... |
| correct output |
|---|
| NO YES 11 YES 2 ... |
| user output |
|---|
| NO YES 11 YES 2 ... Truncated |
Test 3
Group: 3
Verdict: ACCEPTED
| input |
|---|
| 848 4 0 1 2 3 4 0 1 2 4 ... |
| correct output |
|---|
| YES 10223 YES 4021 YES ... |
| user output |
|---|
| YES 23201 YES 4201 YES ... Truncated |
