vijosP1359 Superprime
【思路】
搜索+数学。
很明显的搜索,依次确定每一个数,用参数sum记录dfs即可。
本题的关键在于如何快速判断大素数。
这里素数的判定用到了一个O(sqrt(n))的筛选+试除法,如下:
1、 构造sqrt(n)以内的素数表与素数筛。
2、 对于询问n如果位于sqrt(n)之内则直接查素数筛。
3、 否则,用素数表中的数依次试除。
【代码】
1 #include<iostream> 2 #include<cstring> 3 #include<vector> 4 #include<cmath> 5 using namespace std; 6 7 int n,m,N=1; 8 bool su[10001]; 9 vector<int> primes; 10 11 void get_primes(int n) { 12 memset(su,true,sizeof(su)); 13 su[0]=su[1]=false; 14 m=sqrt(N); 15 for(int i=2;i<=m;i++) if(su[i]) { 16 primes.push_back(i); 17 for(int j=i*i;j<=m;j+=i) su[j]=false; //pause with m 18 } 19 } 20 inline bool is_prime(int x) { 21 if(x<=m) return su[x]; 22 int nc=primes.size(); 23 for(int i=0;i<nc;i++) if(x%primes[i]==0) return false; 24 return true; 25 } 26 27 void dfs(int d,int sum) { 28 if(d==n) { 29 cout<<sum<<"\n"; 30 return ; 31 } 32 for(int i=1;i<=9;i++) { 33 int num=sum*10+i; 34 if(is_prime(num)) dfs(d+1,num); 35 } 36 } 37 38 int main() { 39 cin>>n; 40 for(int i=0;i<n;i++) N *= 10; 41 get_primes(n); 42 dfs(0,0); 43 return 0; 44 }