[BOJ] 3671 - 산업 스파이의 편지
충분히 큰 수까지의(여기서는 7자릿수까지 가능하므로 10,000,000까지 구해본다) 소수를 미리 구해놓는다. 이후 매 수를 입력받을 때 마다 모든 경우의 수를 돌려보며 소수일 경우 카운트해준다.
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <functional>
#include <string.h>
#include <ctype.h>
#include <stack>
#include <set>
#include <stack>
using namespace std;
typedef long long ll;
int cnt;
bool decimal[10000000] = { true, true }, ck[10];
char str[10], tmp[10];
map<int, bool> ck2;
void func() {
char buf[10] = { NULL, };
strcpy(buf, tmp);
sort(buf, buf + strlen(buf));
do {
int now = atoi(buf);
if (!ck2[now] && !decimal[now]) {
ck2[now] = true; cnt++;
}
} while (next_permutation(buf, buf + strlen(buf)));
}
void go(int idx, int now) {
if (idx >= strlen(str)) return;
for (int i = now + 1; i < strlen(str); i++) {
if (!ck[i]) {
ck[i] = true;
tmp[idx] = str[i];
func();
go(idx + 1, i);
ck[i] = false;
tmp[idx] = NULL;
}
}
}
int main(void) {
int t;
for (int i = 2; i < 10000000; i++) {
if (decimal[i]) continue;
for (int j = 2; i * j < 10000000; j++)
decimal[i * j] = true;
}
scanf("%d", &t);
for (int T = 0; T < t; T++) {
map<int, bool>().swap(ck2);
scanf("%s", str);
cnt = 0;
go(0, -1);
printf("%d\n", cnt);
}
return 0;
}
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.