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);
}


原文地址:https://www.cnblogs.com/zhchoutai/p/7210722.html