Submission details
Task:Alkuluvut
Sender:Metabolix
Submission time:2025-09-26 21:54:32 +0300
Language:C++ (C++17)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED17
#2ACCEPTED41
#3ACCEPTED42
Test results
testverdicttimegroup
#1ACCEPTED0.20 s1, 2, 3details
#2ACCEPTED0.20 s2, 3details
#3ACCEPTED0.20 s3details

Compiler report

input/code.cpp: In function 'long int bitit_luvuksi(int)':
input/code.cpp:15:9: warning: unused variable 'numero' [-Wunused-variable]
   15 |     int numero = 0;
      |         ^~~~~~

Code

#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <queue>
#include <stdexcept>

using namespace std;

int numero_biteiksi(int numero) {
    return 1 << numero;
}

long bitit_luvuksi(int bitit) {
    int numero = 0;
    long luku = 0;
    for (int numero = 1; numero <= 10; ++numero) {
        if (bitit & numero_biteiksi(numero % 10)) {
            luku = luku * 10 + numero % 10;
        }
    }
    return luku;
}

int tutki_numerot(long luku) {
    int numerot = 0;
    while (luku > 0) {
        numerot |= numero_biteiksi(luku % 10);
        luku /= 10;
    }
    return numerot;
}

vector<long> ennakko() {
    vector<long> luvut(1024, 0);
    int luvut_puuttuu = luvut.size();
    auto luvut_lisaa = [&](int numerot, long alkuluku) {
        if (luvut[numerot] == 0) {
            luvut[numerot] = alkuluku;
            --luvut_puuttuu;
            return true;
        }
        return false;
    };
    luvut_lisaa(0, -1);
    luvut_lisaa(tutki_numerot(1), 11);
    luvut_lisaa(tutki_numerot(2), 2);
    luvut_lisaa(tutki_numerot(3), 3);
    luvut_lisaa(tutki_numerot(5), 5);
    luvut_lisaa(tutki_numerot(7), 7);
    // 7 ja 0 eivät tee alkulukuja.
    luvut_lisaa(tutki_numerot(70), -1);
    for (int i = 0; i < 1024; ++i) {
        // Parillisista ja viitosesta ei saa alkulukuja (paitsi 2)
        if (!(i & tutki_numerot(1379))) {
            luvut_lisaa(i, -1);
        }
        // Kolmella jaollisista ei saa alkulukuja (paitsi 3)
        if (!(i & tutki_numerot(124578))) {
            luvut_lisaa(i, -1);
        }
    }

    vector<long> alkuluvut = {2, 3};
    auto onko_alkuluku = [&](long luku) {
        if (luku >= alkuluvut.back() * alkuluvut.back()) {
            throw runtime_error("Alkuluvut loppuivat");
        }
        for (long jakaja : alkuluvut) {
            if (jakaja * jakaja > luku) {
                break;
            }
            if (luku % jakaja == 0) {
                return false;
            }
        }
        return true;
    };

    for (long i = 5, j = 2; i * i <= 1234567890999l; i += j, j = 6 - j) {
        if (onko_alkuluku(i)) {
            alkuluvut.push_back(i);
        }
    }

    for (int numerot = 1; numerot <= 1023; ++numerot) {
        if (luvut[numerot] != 0) {
            continue;
        }
        long luku = bitit_luvuksi(numerot);
        queue<long> yritykset;
        yritykset.push(luku);
        while (true) {
            long yritys = yritykset.front();
            if (onko_alkuluku(yritys)) {
                luvut_lisaa(numerot, yritys);
                break;
            }
            yritykset.pop();
            for (int numero = 0; numero <= 9; ++numero) {
                if (!(numerot & numero_biteiksi(numero))) {
                    continue;
                }
                long uusi = yritys * 10 + numero;
                yritykset.push(uusi);
            }
        }
    }

    return luvut;
}

int main() {
    vector<long> luvut = ennakko();
    int testeja;
    cin >> testeja;
    for (int testi = 0; testi < testeja; ++testi) {
        int numeroita;
        cin >> numeroita;
        int numerot = 0;
        for (int i = 0; i < numeroita; ++i) {
            int numero;
            cin >> numero;
            numerot |= numero_biteiksi(numero);
        }
        if (luvut[numerot] > 0) {
            cout << "YES\n" << luvut[numerot] << "\n";
        } else {
            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: ACCEPTED

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

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

correct output
YES
10223
YES
4021
YES
...

user output
YES
12301
YES
12401
YES
...