題目鏈接: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;
}