CFR 568 1A. Primes or Palindromes? ( Brute Force )
Problem - A - Codeforces
一開始以為有二分性質,結果原來只需要暴力。。然後我預處理的部份也寫得太複雜了,其實根本可以更暴力的搞,會很好寫的。
#include <bits/stdc++.h> using namespace std; const int MAXPQ = 1e4 + 4; const int MAXT = 6e6 + 6; typedef long long ll; int p, q; int not_prime[ MAXT ]; int pi[ MAXT ]; void pre(){ not_prime[ 1 ] = 1; for( int i = 2; i < MAXT; ++i ) if( !not_prime[ i ] ) for( int j = i + i; j < MAXT; j += i ) not_prime[ j ] = 1; for( int i = 2; i < MAXT; ++i ) pi[ i ] = pi[ i - 1 ] + !not_prime[ i ]; } int pal1( int x ){ int z = x; queue< int > stk; while( z > 0 ) stk.push( z % 10 ), z /= 10; int res = x; while( !stk.empty() ) res = res * 10 + stk.front(), stk.pop(); return res; } int pal2( int x ){ int z = x; queue< int > stk; while( z > 0 ) stk.push( z % 10 ), z /= 10; int res = x; bool first = true; while( !stk.empty() ){ if( first ){ stk.pop(); first = false; continue; } res = res * 10 + stk.front(), stk.pop(); } return res; } int rub[ MAXT ]; void pre_rub(){ set< int > vis; for( int i = 1; i <= 3000; ++i ){ if( !vis.count( pal1( i ) ) && pal1( i ) < MAXT ) ++rub[ pal1( i ) ], vis.insert( pal1( i ) ); if( !vis.count( pal2( i ) ) && pal2( i ) < MAXT ) ++rub[ pal2( i ) ], vis.insert( pal2( i ) ); } for( int i = 1; i < MAXT; ++i ) rub[ i ] += rub[ i - 1 ]; } bool ok( int x ){ return (ll)q * pi[ x ]<= (ll)p * rub[ x ]; } void solve(){ for( int i = MAXT - 1; i >= 0; --i ) if( ok( i ) ) return (void)( printf("%d\n", i) ); puts("Palindromic tree is better than splay tree"); } int main(){ pre(); pre_rub(); scanf("%d%d", &p, &q); /*printf("%d\n", ok( 173 )); int lb = 0, rb = 1e6, ans = -1; while( lb <= rb ){ int mid = lb + rb >> 1; if( ok( mid ) ) ans = mid, lb = mid + 1; else rb = mid - 1; }*/ solve(); return 0; }