Codeforces Round #315 (Div. 1) A. Primes or Palindromes?【素数+回文数】

题目链接:http://codeforces.com/contest/568/problem/A

题目大意:定义π(n)π(n)为不大于nn的素数个数,rub(n)rub(n)为不大于nn的回文数个数,给定两个数p,qp,qA=pqA=\frac{p}{q},找到最大的nn满足π(n)Arub(n)π(n) ≤ A·rub(n)

题解:我们都知道不大于nn的素数个数大约为nlog(n)\frac{n}{log(n)},且可以发现长度为kk的回文数的个数大约为10k+1210^{\lfloor \frac{k+1}{2} \rfloor}。随着nn的增大,素数的数量渐近地大于回文数的数量,且对于任意AA都有解,对于答案nn的下一个解满足Anlog(n)A\sim\frac{\sqrt {n}}{log(n)}

那么我们可以线性预处理一下n<107n<10^7以内的素数和回文数,然后就可以得到答案。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章