素数个数(素数➕dfs)

用 0,1,2,3 cdots 70,1,2,37 这 88 个数组成的所有整数中,质数有多少个(每个数字必须用到且只能用一次)。

提示:以 00 开始的数字是非法数字。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdlib.h>
 4 #include <string>
 5 #include <string.h>
 6 #include <set>
 7 #include <queue>
 8 #include <stdbool.h>
 9 
10 #define LL long long
11 #define inf 0x3f3f3f3f
12 using namespace std;
13 const int MAXN=77777777;
14 
15 int vis[8];
16 int prime[MAXN];
17 int sum;
18 
19 void is_prime()
20 {
21     memset(prime,true, sizeof(prime));
22     for (int i=2;i<MAXN;i++)
23     {
24         if (prime[i])
25         {
26             for (int j=2*i;j<MAXN;j+=i)
27                 prime[j]=false;
28         }
29     }
30 }
31 
32 void dfs(int x,int y)
33 {
34     if (y == 0)
35     {
36         if (prime[x])
37             sum+=1;
38         return ;
39     }
40     for (int i=0;i<=7;i++)
41     {
42         if (!vis[i])
43         {
44             vis[i]=1;
45             dfs(x*10+i,y-1);
46             vis[i]=0;
47         }
48     }
49 }
50 
51 
52 
53 int main()
54 {
55 #ifndef ONLINE_JUDGE
56     freopen("../in.txt","r",stdin);
57 #endif
58     memset(vis,0, sizeof(vis));
59     sum = 0;
60     is_prime();
61     for (int i=1;i<=7;i++)
62     {
63         vis[i]=1;
64         dfs(i,7);
65         vis[i]=0;
66     }
67     cout << sum << endl;
68     return 0;
69 }
原文地址:https://www.cnblogs.com/-Ackerman/p/11218423.html