题意:
求出给定长度为N的数,使得满足这个数从右边开始一位一位的切掉,剩下的数全部是质数
解法:
一开始想按照顺序枚举,发现预处理质数的时间就已经很复杂了(最大长度为8,[0, 100000000]),
果断搜爆了
看了一下解法提示,一位一位的进行搜索,剪枝条件(第一位数只能是2,3,5,7)其余位数只能是(1,3,5,7,9)
质数条件的限制,然后进行搜索即可,此时判断质数复杂度大为降低,比前一种思路减少了大量的运行时间,所以不能想得
太简单,USACO的题目都是很有质量的
/* ID: lsswxr1 PROG: sprime LANG: C++ */ #include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <string> #include <cstring> #include <fstream> using namespace std; #define USACO #ifdef USACO #define cin fin #define cout fout #endif // ///宏定义 const int INF = 1000000000; const int MAXN = 10251; const int maxn = MAXN; ///全局变量 和 函数 #ifdef USACO ofstream fout ("sprime.out"); ifstream fin ("sprime.in"); #endif int N; int farray[4] = {2, 3, 5, 7}; int arrays[5] = {1, 3, 5, 7, 9}; inline bool isPrime(int cur) { for (int i = 2; i <= sqrt(double(cur)); i++) { if (cur % i == 0) return false; } return true; } void dfs(int num, int level) { if (!isPrime(num)) { return; } if (level == N) { cout << num << endl; } if (level == 0) { for (int i = 0; i < 4; i++) { dfs(farray[i], 1); } } else { for (int i = 0; i < 5; i++) { dfs(num * 10 + arrays[i], level + 1); } } } int main() { while (cin >> N) { dfs(0, 0); } ///结束 return 0; }