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

本文介绍了一个关于寻找最大整数n的问题,其中n的素数个数不超过其回文数个数乘以特定比例。通过预计算方法解决了这个问题,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

题意:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值