| Task: | Alkuluvut |
| Sender: | mangolassi |
| Submission time: | 2025-09-27 13:00:13 +0300 |
| Language: | C++ (C++11) |
| Status: | READY |
| Result: | 0 |
| group | verdict | score |
|---|---|---|
| #1 | WRONG ANSWER | 0 |
| #2 | WRONG ANSWER | 0 |
| #3 | WRONG ANSWER | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | WRONG ANSWER | 0.01 s | 1, 2, 3 | details |
| #2 | WRONG ANSWER | 0.05 s | 2, 3 | details |
| #3 | WRONG ANSWER | 0.05 s | 3 | details |
Compiler report
input/code.cpp: In function 'void solve()':
input/code.cpp:62:43: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
62 | for (int i = 0; i < dig.size(); ++i) {
| ~~^~~~~~~~~~~~Code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using lll = __int128;
const ll MAXVAL = 1e16;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<class T>
T rand(T a, T b) {
return uniform_int_distribution<T>(a, b)(rng);
}
// Deterministic Miller-Rabin
// https://miller-rabin.appspot.com/
// 128-bit integers are required for testing 64-bit numbers.
lll modPow(lll a, lll b, lll mod) {
if (b & 1) return (a * modPow(a, b-1, mod)) % mod;
if (b == 0) return 1;
return modPow((a * a) % mod, b / 2, mod);
}
bool isWitness(lll w, lll ctz, lll odd, lll x) {
w = modPow(w, odd, x);
if (w == 1) return 0;
while(ctz && (w != x - 1)) {
w = (w * w) % x;
--ctz;
}
return (ctz == 0);
}
bool isPrime(ll x) {
if (x <= 1 || (x % 2 == 0 && x > 2)) return 0;
ll ctz = __builtin_ctz(x-1);
ll odd = (x-1) >> ctz;
for (auto b : {2, 325, 9375, 28178, 450775, 9780504, 1795265022}) {
ll w = b % x;
if (w == 0) return 1;
if (isWitness(w, ctz, odd, x)) return 0;
}
return 1;
}
const int N = 10;
int dp[1 << N];
void solve() {
int k;
cin >> k;
vector<int> dig(k);
for (int& d : dig) cin >> d;
sort(dig.begin(), dig.end());
int mask = 0;
for (auto d : dig) mask |= (1 << d);
if (dp[mask] == 0) {
dp[mask] = -1;
do {
if (dig[0] % 2 == 0 || dig[0] % 5 == 0) continue;
ll num = 0, pten = 1;
for (int i = 0; i < dig.size(); ++i) {
num += pten * dig[i];
pten *= 10;
}
if (dig[(int)dig.size() - 1] != 0 && isPrime(num)) {
dp[mask] = num;
break;
}
// try some random stuff
for (int it = 0; dp[mask] == -1 && it < 100; ++it) {
ll test = num, testpten = pten;
while(dp[mask] == -1) {
test = test + testpten * dig[rand(0, (int)dig.size() - 1)];
if (test > MAXVAL || testpten >= MAXVAL) break;
if (test != num && isPrime(test)) dp[mask] = test;
testpten *= 10;
}
}
} while (dp[mask] == -1 && next_permutation(dig.begin(), dig.end()));
}
if (dp[mask] == -1) cout << "NO" << '\n';
else cout << "YES" << '\n' << dp[mask] << '\n';
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
for (int i = 0; i < (1 << N); ++i) dp[i] = 0;
int t;
cin >> t;
for (int ti = 0; ti < t; ++ti) solve();
}
Test details
Test 1
Group: 1, 2, 3
Verdict: WRONG ANSWER
| input |
|---|
| 10 1 0 1 1 ... |
| correct output |
|---|
| NO YES 11 YES 2 ... |
| user output |
|---|
| NO YES 11 NO YES ... |
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 NO YES ... Truncated |
Test 3
Group: 3
Verdict: WRONG ANSWER
| 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 |
