CodeForces #315 (div1) A.Primes or Palindromes?

题目大意:

求出最大的n,使得小于等于n的素数的个数<A*小于等于n的回文数的个数。


解题思路:

显而易见一定有答案。

因为A的值很小,而且回文数的个数很少,所以素数打表暴力统计,回文数暴力判断。

n的最大值大概是130w的样子,倒着枚举就可以了。


#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=8000005, mx=8000000;
bool np[N];
int p[N],pcnt,sum[N];
inline int get(int x) {
	int y=0;
	for(int t=x;t;t/=10) {
		(y*=10)+=t%10;
	}
	return x==y;
}
void init() {
	for(int i=2;i<=mx;++i) {
		if(!np[i]) {
			p[pcnt++]=i;
			sum[i]=1;
		}
		for(int j=0; j<pcnt; ++j) {
			LL t=(LL)p[j]*i;
			if(t>mx) {
				break;
			}
			np[t]=1;
			if(i%p[j]==0) {
				break;
			}
		}
	}
	for(int i=2;i<=mx;++i) {
		sum[i]+=sum[i-1];
	}
	p[0]=0;
	for(int i=1;i<=mx;++i) {
		p[i]=p[i-1]+get(i);
	}
}
int main() {
	int P, q;
	scanf("%d%d",&P,&q);
	init();
	for(int i=mx;i>=1;--i) {
		if((LL)q*sum[i]<=(LL)P*p[i]) {
			printf("%d\n",i);
			return 0;
		}
	}
	puts("Palindromic tree is better than splay tree");
	return 0;
}


你可能感兴趣的:(CodeForces #315 (div1) A.Primes or Palindromes?)