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

题目链接
题目大意:令 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 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;
}

你可能感兴趣的:(codeforces,div-2)