zoukankan      html  css  js  c++  java
  • Codeforces Round #315 (Div. 2)——C. Primes or Palindromes?

    这道题居然是一个大暴力。。。

    题意:

     π(n):小于等于n的数中素数的个数

     rub(n) :小于等于n的数中属于回文数的个数

    然后给你两个数p,q,当中A=p/q。 然后要你找到对于给定的A。找到使得π(n) ≤ A·rub(n) 最大的n。

    (A<=42)

    思路:

    首先我们能够暴力算出当n为大概150万左右的时候,π(n)大概是 rub(n) 的42倍。

    所以我们仅仅须要for到150万左右就好,由于对于后面的式子。肯定能在150万的范围内找到一个n使得这个式子成立的。

    并且。我们可以得出由于素数的增长速度肯定是大于回文数的增长速度的,所以我们肯定可以保证这个式子是成立的。

    所以。按理说应该不存在impossible的情况。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<set>
    #include<map>
    #include<queue>
    #include<math.h>
    using namespace std;
    #define maxn 2000020
    int flag[maxn],num[maxn];
    int pal[maxn];
    int gcd(int a,int b){
    	if(b!=0) return gcd(b,a%b);
    	else return a;
    }
    void getprime(){
    	fill(num,num+1+maxn,1);
    	num[0]=num[1]=0;
    	int t=0;
    	for(int i=2;i<=maxn;i++){
    		if(num[i]){
    			for(int j=2*i;j<=maxn;j+=i){
    				num[j]=0;
    			}
    		}
    		num[i]+=num[i-1];
    	}
    }
    bool judge(int n){
    	int t=0;
    	while(n){
    		pal[t++]=n%10;
    		n=n/10;
    	}
    	for(int i=0;i<t/2;i++){
    		if(pal[i]!=pal[t-1-i]) return false;
    	}
    	return true;
    }
    int main(){
    	getprime();
    	int m=0,c=0;
    	int p,q;
    	scanf("%d%d",&p,&q);
    	int lmax=-1;
    	for(int i=1;i<=maxn;i++){
    		if(judge(i)&&i!=0) c++;
    		if(q*num[i]<=p*c){
    			lmax=i;
    		}
    	}
    	if(lmax==-1) printf("Palindromic tree is better than splay tree
    ");
    	else printf("%d
    ",lmax);
    }


  • 相关阅读:
    UVA 11605 Lights inside a 3d Grid
    UVA 10288 Coupons
    UVA 11637 Garbage Remembering Exam
    阿里上市全解读【转载】
    C# 创建系统服务并定时执行【转载】
    Ehcache 整合Spring 使用页面、对象缓存
    详解 Tomcat 的连接数与线程池(转)
    Mysql主从热备
    centos上yum安装异常处理
    tomcat运行模式APR安装
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7210722.html
Copyright © 2011-2022 走看看