博客園速度非常不穩定,可能要考慮換地方了。雖然我非常喜歡博客園的模板和氣氛。
這個題早就知道是怎么做的了。先求出回文數在再判斷是不是素數。關鍵是不知道區間,那就把所有的全部求出來。雖然可能會超時,但是如果使用點技巧的話還是沒問題的。
如果先篩素數的話開一億的數組90m,肯定超內存了。據說可以只開一千萬的,因為偶數就不用判了嘛。這個具體怎么實現尚不知曉。usaco的判題機構貌似極其嚴格,就連偽素數測試都能挑出錯來。就直接拿模板上的素性測試過了。自己寫的暴力測素數函數超了。代碼貼一下。日后再整理吧。這兩天都沒怎么寫解題報告了。
/*
ID: like_091
PROG: pprime
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<string>
#include<cmath>
using namespace std;
const int MAX = 15000;
int p[MAX], k = 0;
bool is_prime(int u)
{if (u == 0 || u == 1) return false;if (u == 2) return true;if (u % 2 == 0) return false;for (int i = 3; i <= sqrt(u); i += 2)if (u % i ==0) return false;return true;
}
void add()
{int d[4] = {1, 3, 7, 9};p[k++] = 5;p[k++] = 7;p[k++] = 11;for (short i = 0; i < 4; i++)for (short j = 0; j < 10; j++)p[k++] = d[i] * 101 + j * 10;for (short i = 0; i < 4; i++)for (short j = 0; j < 10; j++)p[k++] = d[i] * 1001 + j * 110;for (short i = 0; i < 4; i++)for (short j = 0; j < 10; j++)for (short l = 0; l < 10; l++)p[k++] = d[i] * 10001 + j * 1010 + l * 100;for (short i = 0; i < 4; i++)for (short j = 0; j < 10; j++)for (short l = 0; l < 10; l++)p[k++] = d[i] * 100001 + j * 10010 + l * 1100;for (short i = 0; i < 4; i++)for (short j = 0; j < 10; j++)for (short l = 0; l < 10; l++)for (short m = 0; m < 10; m++)p[k++] = d[i] * 1000001 + j * 100010 + l * 10100 + m * 1000;for (short i = 0; i < 4; i++)for (short j = 0; j < 10; j++)for (short l = 0; l < 10; l++)for (short m = 0; m < 9; m++)p[k++] = d[i] * 10000001 + j * 1000010 + l * 100100 + 11000;
}
int main()
{ifstream cin("pprime.in");ofstream cout("pprime.out");add();int a, b;cin>>a>>b;int q = 0;while (p[q] < a)++q;while (q < k){if (p[q] <= b && is_prime(p[q]))cout<<p[q]<<endl;q++;}return 0;
}