Submission details
Task:Alkuluvut
Sender:mangolassi
Submission time:2025-09-27 13:01:22 +0300
Language:C++ (C++11)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
Test results
testverdicttimegroup
#10.01 s1, 2, 3details
#20.05 s2, 3details
#3ACCEPTED0.05 s3details

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;
ll 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:

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:

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