码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #315 (Div. 2)——C. Primes or Palindromes?

时间:2015-08-12 01:25:54      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:codeforces   数学   

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

题意:

 π(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\n");
	else printf("%d\n",lmax);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #315 (Div. 2)——C. Primes or Palindromes?

标签:codeforces   数学   

原文地址:http://blog.csdn.net/acmer_hades/article/details/47430443

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!