Submission

Status:

-----xx-xx

Subtask/Task Score:

0/100

Score: 0

User: nga12345

Problemset: การเรียงสับเปลี่ยน

Language: cpp

Time: 0.009 second

Submitted On: 2025-10-11 11:07:35

#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <algorithm>
#include <cmath>

using namespace std;

int max_n;
vector<bool> is_prime;

void sieve(int limit) {
    is_prime.assign(limit + 1, true);
    if (limit >= 0) is_prime[0] = false;
    if (limit >= 1) is_prime[1] = false;
    int sqrt_limit = sqrt(limit);
    for (int i = 2; i <= sqrt_limit; ++i) {
        if (is_prime[i]) {
            for (int j = i * i; j <= limit; j += i)
                is_prime[j] = false;
        }
    }
}

bool isPrime(int num) {
    if (num < 0 || num >= (int)is_prime.size()) return false;
    return is_prime[num];
}

set<int> unique_primes_found;

void generate_numbers(
    const string& all_digits, 
    string& current_number_str, 
    vector<bool>& used) 
{
    if (!current_number_str.empty()) {
        int number = stoi(current_number_str);
        
        if (number < (int)is_prime.size()) { 
            if (isPrime(number)) {
                unique_primes_found.insert(number);
            }
        }
    }
    
    for (int i = 0; i < (int)all_digits.length(); ++i) {
        if (!used[i]) {
            if (i > 0 && all_digits[i] == all_digits[i-1] && !used[i-1]) {
                continue;
            }

            used[i] = true;
            current_number_str.push_back(all_digits[i]);

            generate_numbers(all_digits, current_number_str, used);

            current_number_str.pop_back();
            used[i] = false;
        }
    }
}

int countUniquePrimePermutations(const string& digits) {
    unique_primes_found.clear();

    string sorted_digits = digits;
    sort(sorted_digits.begin(), sorted_digits.end()); 
    
    string current_number_str;
    vector<bool> used(sorted_digits.length(), false);

    generate_numbers(sorted_digits, current_number_str, used);

    return unique_primes_found.size();
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int m, length;
    cin >> m >> length; 

    max_n = pow(10, length) - 1;
    sieve(max_n);

    for (int i = 0; i < m; ++i) {
        string input;
        cin >> input;
        cout << countUniquePrimePermutations(input) << '\n';
    }

    return 0;
}