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