0w1

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;
}