Codeforces 568A Primes or Palindromes?

Rikhail Mubinchik believes that the current definition of prime numbers is obsolete as they are too complex and unpredictable. A palindromic number is another matter. It is aesthetically pleasing, and it has a number of remarkable properties. Help Rikhail to convince the scientific community in this!

Let us remind you that a number is called prime if it is integer larger than one, and is not divisible by any positive integer other than itself and one.

Rikhail calls a number a palindromic if it is integer, positive, and its decimal representation without leading zeros is a palindrome, i.e. reads the same from left to right and right to left.

One problem with prime numbers is that there are too many of them. Let's introduce the following notation: π(n) — the number of primes no larger than nrub(n) — the number of palindromic numbers no larger than n. Rikhail wants to prove that there are a lot more primes than palindromic ones.

He asked you to solve the following problem: for a given value of the coefficient A find the maximum n, such that π(n) ≤ A·rub(n).

Input

The input consists of two positive integers pq, the numerator and denominator of the fraction that is the value of A ().

Output

If such maximum number exists, then print it. Otherwise, print "Palindromic tree is better than splay tree" (without the quotes).

Sample test(s)
input
1 1
output
40
input
1 42
output
1
input
6 4
output
172

解题思路: 
估计一下n的范围可以发现完全可以采用暴力的方法来解决,由于素数的个数的增长速度是要比回文数增长速度快的,因此可以在一个范围内暴力查找那个最大值。
#include <ctime>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 2000010;
bool mark[maxn];
int  a[maxn], b[maxn], c[110];

void init() {
    memset(mark, true, sizeof(mark));
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    b[1] = 1;
    for(int i = 2; i < maxn; ++i) {
        a[i] = a[i-1];
        b[i] = b[i-1];
        if(mark[i]) {
            a[i]++;
            for(int j = 2 * i; j < maxn; j += i) mark[j] = false;
        }
        int cnt = 0;
        int x = i;
        bool ok = true;
        while(x) {
            c[cnt++] = x%10;
            x /= 10;
        }
        for(int j = 0, k = cnt - 1; j < k; ++j, --k) {
            if(c[j] != c[k]) {
                ok = false;
                break;
            }
        }
        if(ok) b[i]++;
    }
    return ;
}


int main() {

    init();
    int p, q, ans;
    cin >> p >> q;
    for(int i = maxn - 1; i >= 1; --i) {
        if(1LL*q*a[i] <= 1LL*p*b[i]) {
            ans = i;
            break;
        }
    }
    cout << ans << endl;
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值