* 그때 zp에서 소수 빨리 구하는 방법을 했던 적이 있더래죠. 난 그런거 뭐하러 하나 했는데..;; * 뼈저리게 느껴집니다. 알고리즘의 중요성을.. * 테스트 해서 5초 넘기면 다시 짜오라네요. 첨에 소수 걍 아무렇게나 구해서 냈더니.. 한 천만쯤 가니까 어이없는 시간이 나오더군요..;; 그래서 소수의 성질 생각해서 이리저리 뜯어 고치다가 별 이상한 방법으로 9개 테스트 모두 5초 이내 통과 했습니다. ㅠ.ㅠ 마지막 테스트는 4.9xXX초 라는;;--; {{{~cpp #include #include #include #include using namespace std; ifstream fin("pprime.in"); ofstream fout("pprime.out"); void InputMinMax(int& n, int& m); string IntConvertToString(int n); bool IsPrime(const int& n); bool IsPalinDromes(const string& str); void OutputResult(const int& n, const int& m); void FillPrimeList(const int& n, const int& m); int main() { int max,min; InputMinMax(min, max); OutputResult(min,max); return 0; } void InputMinMax(int& min, int& max) { fin >> min; fin >> max; } void OutputResult(const int& min, const int& max) { int init; if(min<7) init = 5; else init = (min/6)*6 + 1; bool flag[3] = {false,}; for(int i = init ; i <=max ;) { if(IsPalinDromes(IntConvertToString(i))) { if(IsPrime(i)) { fout << i << endl; } } int temp; if(i >= 1000 && !flag[0]) { temp = 9997; flag[0] = true; } if(i >= 100000 && !flag[1]) { temp = 999997; flag[1] = true; } if(i >= 10000000 && !flag[2]) { temp = 99999997; flag[2] = true; } if(flag[0] && flag[1] && flag[2]) i = temp; if(i%6==1) i += 4; else if(i%6==5) i += 2; } } string IntConvertToString(int n) { int maxlessn ; string ret; for(int i = 1 ; i <= 100000000 ; i *= 10) { if(i > n) { maxlessn = i/10; break; } } for(int i = maxlessn ; i >= 1 ; i /= 10) { int t = n / maxlessn; n -= maxlessn * t; maxlessn /= 10; ret += (char)t + 48; } return ret; } bool IsPalinDromes(const string& str) { if( (str.length() % 2 == 0) && str.length() < 2) return false; int n = str.length()/2; for(int i = 0 ; i < n ; i++) { if( str[i] != str[str.length() - i - 1] ) return false; } return true; } bool IsPrime(const int& n) { if(!(n%2)) return false; for(int i = 3 ; i <= sqrt(n) ; i+=2) { if(!(n%i)) return false; } return true; } }}}