?【深基4.例13】质数口袋 - 洛谷
/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-04-08 16:39:55
* @LastEditTime: 2022-04-08 16:48:46
*/
#include<bits/stdc++.h>
using namespace std;
bool isPrime[100000005];//1 表示是素数
int Prime[100000005],cnt=0;//存质数
void GetPrime(int x)
{
memset(isPrime,1,sizeof(isPrime));
isPrime[1]=0;//1不是素数
for(int i=2;i<=x;i++)
{
if(isPrime[i])
{
Prime[++cnt]=i;//纪录素数, 这个prime[0] 相当于 cnt,用来计数
}
for(int j=1;j<=cnt&&i*Prime[j]<=x;j++)
//从Prime[1],即最小质数2开始,逐个枚举已知的质数,并期望Prime[j]是(i*Prime[j])的最小质因数
//当然,i肯定比Prime[j]大,因为Prime[j]是在i之前得出的
{
isPrime[i*Prime[j]]=0;
if(i%Prime[j]==0)
break;
}
}
}
int main()
{
int n,q;
cin>>n;
if(n == 0){
cout << 0 << endl;
return 0;
}
if(n == 1){
cout << 0<< endl;
return 0;
}
GetPrime(n);
int ans = 0;
int sum = 0;
for(int i = 1;i <= n;i ++){
if(sum + Prime[i] <= n){
sum += Prime[i];
cout << Prime[i] << endl;
ans++;
}
else
break;
}
cout << ans << endl;
}
|