USACO 1.5.2 ★Prime Palindromes
题意:给定区间[a, b]求出区间里面的所有 回文质数
解法:
最简单的做法是枚举所有的数字,判断两个条件,但在第9组数据的时候时间会爆
看了一下HINT,题目提示预先产生所有的回文数,将遍历所有数组的时间将为常数时间产生数组,
HINT给出的回文数产生方法更为巧妙,采用这样的思路大幅降低了运行时间
/* ID: lsswxr1 PROG: pprime 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; ///全局变量 和 函数 int a, b; bool isPrime(int cur) { for (int i = 2; i <= sqrt(double(cur)); i++) { if (cur % i == 0) return false; } return true; } int palinArray[maxn]; int main() { #ifdef USACO ofstream fout ("pprime.out"); ifstream fin ("pprime.in"); #endif while (cin >> a >> b) { //产生回文数 int cntPalins = 0; //1 digit for (int i = 5; i <= 9; i++) { if (i >= a && i <= b) { palinArray[cntPalins++] = i; } } //2 digit if (11 >= a && 11 <= b) { palinArray[cntPalins++] = 11; } //3 digit for (int d1 = 1; d1 <= 9; d1+=2) /* only odd; evens aren't so prime */ { for (int d2 = 0; d2 <= 9; d2++) { int palindrome = 100 * d1 + 10 * d2 + d1; if (palindrome >= a && palindrome <= b) { palinArray[cntPalins++] = palindrome; } } } //5 digit for (int d1 = 1; d1 <= 9; d1+=2) /* only odd; evens aren't so prime */ { for (int d2 = 0; d2 <= 9; d2++) { for (int d3 = 0; d3 <= 9; d3++) { int palindrome = 10000 * d1 + 1000 * d2 +100 * d3 + 10 * d2 + d1; if (palindrome >= a && palindrome <= b) { palinArray[cntPalins++] = palindrome; } } } } //7digit for (int d1 = 1; d1 <= 9; d1+=2) /* only odd; evens aren't so prime */ { for (int d2 = 0; d2 <= 9; d2++) { for (int d3 = 0; d3 <= 9; d3++) { for (int d4 = 0; d4 <= 9; d4++) { int palindrome = 1000000 * d1 + 100000 * d2 +10000 * d3 + 1000 * d4 + 100 * d3 + 10 * d2 + d1; if (palindrome >= a && palindrome <= b) { palinArray[cntPalins++] = palindrome; } } } } } // for (int i = 0; i < cntPalins; i++) { if (isPrime(palinArray[i])) { cout << palinArray[i] << endl; } } } ///结束 return 0; }