codeforces 568a//Primes or Palindromes?// Codeforces Round #315 (Div. 1)

Posted gaudar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 568a//Primes or Palindromes?// Codeforces Round #315 (Div. 1)相关的知识,希望对你有一定的参考价值。

题意:求使pi(n)*q<=rub(n)*p成立的最大的n。

先收集所有的质数和回文数。质数好搜集。回文数奇回文就0-9的数字,然后在头尾添加一个数。在x前后加a,就是x*10+a+a*pow(10,2)。偶回文同理。然后不能二分,因为比值不是单调的。

乱码:

#pragma comment(linker,"/STACK:1024000000,1024000000") 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
using namespace std;
const int SZ=1e7+10,INF=0x7FFFFFFF;
typedef long long lon;

vector<lon> pri,pld;
bool isp[SZ];

void init()
{
    memset(isp,1,sizeof(isp));
    isp[0]=isp[1]=0;
    for(lon i=2;i*i<SZ;++i)
    {
        for(lon j=i*i;j<SZ;j+=i)
        {
            isp[j]=0;
        }
    }
    for(lon i=2;i<SZ;++i)
    {
        if(isp[i])
        {
            pri.push_back(i);
        }
    }
}

lon pow(lon x,lon p,int rbs1,int rbs2)
{
    lon res=1,ele=x;
    for(;p;p>>=1)
    {
        if(p&1)res*=ele;
        ele=ele*ele;
    }
    return res;
}

void getp(lon x,lon bit)
{
    if(bit>8)
    {
        return;
    }
    lon res;
    for(lon i=0;i<=9;++i)
    {
        res=0;
        res=x*10;
        res+=(bit&1)?i*pow((lon)10,bit+1,0,0):i*pow((lon)10,bit+1,0,0);
        res+=i;
        if(i)pld.push_back(res);
        getp(res,bit+2);
    }
}

int main()
{
    std::ios::sync_with_stdio(0);
    init();
    for(lon i=0;i<=9;++i)
    {
        if(i)pld.push_back(i*11);
        getp(i*11,2);
    }
    for(lon i=0;i<=9;++i)
    {
        if(i)pld.push_back(i);
        getp(i,1);
    }
    sort(pld.begin(),pld.end());
//    for(int i=0;i<pld.size();++i)
//    {
//        cout<<pld[i]<<endl;
//    }
    //cout<<pri.size()<<" "<<pld.size()<<endl;
    lon p,q;
    cin>>p>>q;
    lon res=0;
    for(lon i=1;i<2e6+10;++i)
    {
        lon num1=upper_bound(pri.begin(),pri.end(),i)-pri.begin();
        lon num2=upper_bound(pld.begin(),pld.end(),i)-pld.begin();
        //if(i<2600&&i>2500)cout<<i<<" "<<num1<<" "<<num2<<endl;
        if(num1*q<=num2*p)
        {
            res=max(res,i);
        }
    }
    cout<<res<<endl;
    return 0;
}

 

以上是关于codeforces 568a//Primes or Palindromes?// Codeforces Round #315 (Div. 1)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #568 (Div. 2)A

Codeforces Round #568 (Div. 2)B

codeforces 568 D Sign Posts

Codeforces Round #568 Div.2

Codeforces Round #568 (Div. 2) G1. Playlist for Polycarp (easy version) (状压dp)

codeforces 892A - Greed - [超级大水题][O(n)数组最大和次大]