题目链接:http://codeforces.com/problemset/problem/568/A
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 n, rub(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 p, q, 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).
Examples
input
Copy
1 1
output
Copy
40
input
Copy
1 42
output
Copy
1
input
Copy
6 4
output
Copy
172
题意:问最大n是多少时素数个数比上回文个数小于等于p/q;
思路:开始我没想到用42可以确定n的最大范围,打表可以发现素数的增加远大于回文数。我用的范围是1e7。这种题多测试几次就会逼近正确值。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define LL long long
using namespace std;
const int maxn=1e7;
int prime[maxn];
int vis[maxn];
void init()
{
vis[1]=1;
for(int i=2;i<maxn;i++)
{
if(!vis[i])
{
prime[++prime[0]]=i;
}
for(int j=1;j<=prime[0];j++)
{
if(prime[j]*i>=maxn)
{
break;
}
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
break;
}
}
}
return ;
}
int check2(int y)
{
int st[20];
int cnt=0;
while(y)
{
st[cnt++]=y%10;
y/=10;
}
int flag=1;
//cout<<cnt<<endl;
for(int i=0;i<cnt/2;i++)
{
//cout<<st[i]<<" "<<st[cnt-i-1]<<endl;
if(st[i]!=st[cnt-i-1])
{
return 0;
}
}
return 1;
}
int main()
{
init();
double p,q;
int cnt1=0,cnt2=0;
cin>>p>>q;
int ans=1;
for(int i=1;i<maxn;i++)
{
cnt1+=(!vis[i]);
cnt2+=check2(i);
//cout<<i<<" "<<cnt1<<" "<<cnt2<<" "<<cnt1/cnt2<<endl;
if(1.0*cnt1<=1.0*cnt2*p/q)
{
//cout<<i<<" "<<cnt1<<" "<<cnt2<<endl;
ans=i;
}
}
cout<<ans<<endl;
return 0;
}
反思:遇到不确定的范围先打表看看。