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

浙公网安备 33010602011771号