# 題目: UVa 12218 - An Industrial Spy
# 題目說明
給一個至多 7 位的數,求每個數字排列後,為質數的數量
例如: 17
可以排成: 1、7、17、71
共有 7、17、71
3 個質數
INPUT:
第一行輸入一個整數 N
,代表測資數
每筆測資輸入一個至多 7 位的數 str
OUTPUT:
輸出 str
排列後,為質數的數量
# 解題方法
先根據題目範圍建質數表 1 ~ 10000000
接著跑 dfs
,找出所有可能的排列並存入 result
最後計算質數的數量
# 參考程式碼
#include <iostream> | |
#include <vector> | |
#include <sstream> | |
#include <unordered_set> | |
#include <algorithm> | |
using namespace std; | |
vector<bool> is_prime; | |
unordered_set<int> result; | |
void find_prime() | |
{ | |
is_prime.assign(10000000, true); | |
is_prime[0] = is_prime[1] = false; | |
for (int i = 2; i < 10000000; ++i) | |
{ | |
if (is_prime[i]) | |
{ | |
for (int j = i << 1; j < 10000000; j += i) is_prime[j] = false; | |
} | |
} | |
} | |
void dfs(string str, string target, int now, int Max) | |
{ | |
if (now == Max) | |
{ | |
stringstream ss(target); | |
int tmp; | |
ss >> tmp; | |
result.emplace(tmp); | |
return; | |
} | |
for (size_t i = 0; i < str.size(); ++i) | |
{ | |
auto s = str; | |
s.erase(s.begin() + i); | |
dfs(s, target + str[i], now + 1, Max); | |
} | |
} | |
int main() | |
{ | |
// fast io | |
ios::sync_with_stdio(false); | |
cin.tie(nullptr); | |
cout.tie(nullptr); | |
// find all prime number between 1 ~ 10000000 | |
find_prime(); | |
int N; | |
string str; | |
cin >> N; | |
while (N-- && cin >> str) | |
{ | |
result.clear(); | |
int cnt = 0; | |
// use dfs to find all permutation of str | |
for (size_t i = 1; i <= str.size(); ++i) dfs(str, "", 0, i); | |
for (auto& i : result) if (is_prime[i]) ++cnt; | |
cout << cnt << "\n"; | |
} | |
return 0; | |
} |