用 0,1,2,3 cdots 70,1,2,3⋯7 这 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 }