LuoguP5723 【深基4.例13】质数口袋 题解

Content

输入一个数\(L(1\leqslant L\leqslant100000)\),判断最多能有多少个质数的和为\(L\)。输出这些质数,并输出最多个数(保证每个质数不重复)。

Solution

这道题其实用暴力也可以解决。但是,一道质数筛的好题为什么不用质数筛去做呢?

这道题目主要是讲的埃氏筛法,它的核心思想是:如果\(n\)是质数,那么\(2n,3n,4n,...\)这些\(n\)的倍数肯定都不是质数。

其次,如果选的数要多,那么要选的每个数要尽可能小。

所以,一套流程就这么下来了:

  • 用埃氏筛筛出\(100000\)以内的质数以备用。
  • 输入完之后,从最小的质数开始,然后第\(2\)小,第\(3\)小……由小往大,只要是质数都取,一直取到和超过\(L\)为止。

时间复杂度\(\Theta(n \log{\log{n}})\),当\(n\)取到最大的\(100000\)时,也就\(\Theta(70000)\)左右,足以通过本题。

Code

#include <cstdio>
#include <algorithm>
using namespace std;

bool prime[100007];
int l;

void ai() {
	for(int i = 2; i <= 100000; ++i)	prime[i] = 1;
	for(int i = 2; i <= 100000; ++i)
		if(prime[i])
			for(int j = i * 2; j <= 100000; j += i)
				prime[j] = 0;	
}

int main() {
	scanf("%d", &l);
	int p = l, sum = 0;
	ai();
	for(int i = 1; i <= p; ++i) {
		if(prime[i]) {
			printf("%d\n", i);
			p -= i;
			sum++;
		}
		if(p <= 0)	break;
	} 
	printf("%d", sum);
	return 0;
}
posted @ 2021-12-23 20:53  Eason_AC  阅读(116)  评论(0)    收藏  举报