题目链接:http://codeforces.com/contest/568/problem/A
题目大意:定义为不大于的素数个数,为不大于的回文数个数,给定两个数,,找到最大的满足。
题解:我们都知道不大于的素数个数大约为,且可以发现长度为的回文数的个数大约为。随着的增大,素数的数量渐近地大于回文数的数量,且对于任意都有解,对于答案的下一个解满足。
那么我们可以线性预处理一下以内的素数和回文数,然后就可以得到答案。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+10;
int a[maxn],prime[maxn],vis[maxn];
int pi[maxn],rub[maxn];
int is_palindrome(int n)
{
int tmp=n;
int sum=0;
while(tmp){
sum=sum*10+tmp%10;
tmp/=10;
}
if(sum==n){
return 1;
}
else{
return 0;
}
}
void solve()
{
for(int i=2;i<maxn;i++){
if(vis[i]==0){
prime[i]=1;
for(int j=2*i;j<maxn;j+=i){
vis[j]=1;
}
}
}
pi[1]=0;
rub[1]=1;
for(int i=2;i<maxn;i++){
pi[i]=pi[i-1]+prime[i];
rub[i]=rub[i-1]+is_palindrome(i);
}
}
double p,q;
int main()
{
cin>>p>>q;
solve();
int ans=maxn-1;
while(ans){
if(1.0*pi[ans]/(1.0*rub[ans])<=p/q){
break;
}
ans--;
}
cout<<ans<<endl;
return 0;
}