【杂题】CodeforcesRound #315 (Div. 2)569C Primes or Palindromes?

来源:互联网 发布:工业网络交换机 编辑:程序博客网 时间:2024/06/04 18:06

题目链接
题目大意:令g(x)表示x以内的素数个数,f(x)表示x以内回文数的个数。求最大的x使得g(x)<=Af(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 1200005using 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;}
1 0