Submission

Status:

PPPPPxxPxx

Subtask/Task Score:

60/100

Score: 60

User: Imorange

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

Language: cpp

Time: 0.005 second

Submitted On: 2026-03-04 19:30:03

#include <bits/stdc++.h>
using namespace std;

static const int LIM = 1000000;
vector<bool> prime(LIM+1, true);

vector<char> num;
vector<char> used;

int n;
int ans;

void sieve() {
    prime[0] = prime[1] = false;
    for(int i = 2; i * i <= LIM; i++){
        if(prime[i]){
            for(int j = i * i; j <= LIM; j += i)
                prime[j] = false;
        }
    }
}

void dfs(int depth, int value){
    if(depth == n){
        if(prime[value]) ans++;
        return;
    }

    for(int i = 0; i < n; i++){
        if(used[i]) continue;

        if(i > 0 && num[i] == num[i-1] && !used[i-1]) continue;

        used[i] = 1;
        dfs(depth + 1, value * 10 + (num[i] - '0'));
        used[i] = 0;
    }
}

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

    int m;
    cin >> m >> n;

    sieve();

    while(m--){
        string s; 
        cin >> s;
        num.assign(s.begin(), s.end());
        sort(num.begin(), num.end());
        used.assign(n, 0);
        ans = 0;

        dfs(0, 0);
        cout << ans << "\n";
    }
}