Codeforces 568A Primes or Palindromes?

来源:互联网 发布:网页社交软件 编辑:程序博客网 时间:2024/05/29 02:04

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



0 0
原创粉丝点击