题目链接
题目大意:令 g(x) 表示 x 以内的素数个数, f(x) 表示 x 以内回文数的个数。求最大的 x 使得 g(x)<=A∗f(x) (1/42<=A<=42)
一道水题。
直接预处理出MAXN以内所有数的 g(x),f(x) ,然后从大到小遍历一遍
然而蒟蒻一开始以为这个有单调性,幸好有样例三- -
今后打算写二分时一定要先判断单调性!!
我一开始定义 MAXN=1000000 (跟着感觉走的- -),然而WA了~(≧▽≦)/~
之后仔细一算 MAXN 应该为 1200000 ……
以后不能乱跟感觉走,如果是OI赛制就滚粗了- -
#include <iostream>
#include <cstdio>
#define LL long long int
#define MAXN 1200005
using namespace std;
LL phi[MAXN] ,b[MAXN] ,p ,q ;
int num[35] ;
bool flag[MAXN] ;
bool judge(int x){
int cnt=0 ;
while(x)
{
num[cnt++]=x%10;
x/=10;
}
for(int i=0;i<cnt/2;i++)
if(num[i]!=num[cnt-1-i])
return 0;
return 1;
}
void init()
{
for(int i=2;i<MAXN;++i)
if(!flag[i])
for(int j=i+i;j<MAXN;j+=i)
flag[j]=1;
for(int i=2;i<MAXN;++i)
{
phi[i]=phi[i-1];
if(!flag[i])++phi[i];
}
for(int i=1;i<MAXN;++i)
b[i]=b[i-1]+judge(i);
}
int main()
{
init();
bool flag;
while(scanf("%I64d%I64d",&p,&q)!=EOF)
{
flag=1;
for(int i=MAXN-1;i>0;--i)
if(q*phi[i]<=p*b[i])
{
printf("%d\n",i);
flag=0 ;
break;
}
if(flag)puts("Palindromic tree is better than splay tree");
}
return 0;
}