这道题应该也算CHAPTER1中有点儿价值的题。考察到了二分搜索和miller rabin判断质数。 【prime palindromes】 /* ID: wangia6 TASK: pprime LANG: C++ */ #include <fstream> #include <cstdlib> using namespace std; const long INF = 150000000; long tot = 0,list[1000000]; void make_palindrome() { long a,b,c,d; for (d = 1; d <= 9; d++) { list[tot] = d; tot++; } for (d = 1; d <= 9; d++) { list[tot] = d * 11; tot++; } for (c = 1; c <= 9; c++) for (d = 0; d <= 9; d++) { list[tot] = c * 101 + d * 10; tot++; } for (c = 1; c <= 9; c++) for (d = 0; d <= 9; d++) { list[tot] = c * 1001 + d * 110; tot++; } for (b = 1; b <= 9; b++) for (c = 0; c <= 9; c++) for (d = 0; d <= 9; d++) { list[tot] = b * 10001 + c * 1010 + d * 100; tot++; } for (b = 1; b <= 9; b++) for (c = 0; c <= 9; c++) for (d = 0; d <= 9; d++) { list[tot] = b * 100001 + c * 10010 + d * 1100; tot++; } for (a = 1; a <= 9; a++) for (b = 0; b <= 9; b++) for (c = 0; c <= 9; c++) for (d = 0; d <= 9; d++) { list[tot] = a * 1000001 + b * 100010 + c * 10100 + d * 1000; tot++; } for (a = 1; a <= 9; a++) for (b = 0; b <= 9; b++) for (c = 0; c <= 9; c++) for (d = 0; d <= 9; d++) { list[tot] = a * 10000001 + b * 1000010 + c * 100100 + d * 11000; tot++; } list[tot] = INF; tot++; return; } long bsearch(long key,long st,long en,bool flag) { long mid = (st + en) >> 1; if ((flag) && (en - st == 1) && (key == list[st])) return st; else if ((! flag) && (en - st == 1) && (key == list[en])) return en + 1; else if (en - st == 1) return en; if (list[mid] <= key) return bsearch(key,mid,en,flag); else if (list[mid] > key) return bsearch(key,st,mid,flag); } long long sqr(long long x) { return x * x; } long long mod_pow(long a,long n,long m) { if (n == 0) return 1 % m; else if (n == 1) return a % m; else if (! (n & 1)) return sqr(mod_pow(a,n >> 1,m)) % m; else if (n & 1) return a * (sqr(mod_pow(a,n >> 1,m)) % m) % m; } bool miller_rabin(long x) { long long a; for (int i = 0; i < 15; i++) { a = (rand() % (x - 1)) + 1; if (mod_pow(a,x-1,x) != 1) return false; } return true; } int main() { ifstream infile; infile.open("pprime.in"); ofstream outfile; outfile.open("pprime.out"); long st,en; infile >> st >> en; make_palindrome(); long leftp = bsearch(st,0,tot,true); long rightp = bsearch(en,0,tot,false); for (long i = leftp; i < rightp; i++) if (miller_rabin(list[i])) outfile << list[i] << endl; infile.close(); outfile.close(); return 0; }