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 ... |
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 ... |