CF17A Noldbach problem 题解

Content

若一个素数可以用比它小的相邻的两个素数的和加 \(1\) 表示,那么称这个素数为"好素数"。 给定两个正整数 \(n,k\),问从 \(2\)\(n\) 的好素数个数是否 \(\geqslant k\)

数据范围:\(2\leqslant n\leqslant 1000,0\leqslant k\leqslant 1000\)

Solution

直接通过埃氏筛得到 \(1000\) 以内的素数,再通过直接暴力枚举预处理出 \(1000\) 以内的“好素数”,最后再遍历 \(2\)\(n\) 求得这段区间以内“好素数”的数量,判断即可。

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;

int n, k, ans, isprime[1007], primes[1007], goodprimes[1007];

int main() {
	for(int i = 2; i <= 1000; ++i) isprime[i] = 1;
	for(int i = 2; i <= 1000; ++i)
		if(isprime[i]) {
			primes[++primes[0]] = i;
			for(int j = i * 2; j <= 1000; j += i)
				isprime[j] = 0;
		}
	for(int i = 1; i <= primes[0]; ++i)
		for(int j = 1; j < i - 1; ++j)
			if(primes[i] == primes[j] + primes[j + 1] + 1) {
				goodprimes[primes[i]] = 1;
				break;
			}
	scanf("%d%d", &n, &k);
	for(int i = 2; i <= n; ++i) {
		if(ans == k) return printf("YES"), 0;
		if(goodprimes[i]) ans++;
	}
	if(ans == k) return printf("YES"), 0;
	printf("NO");
	return 0;
}

posted @ 2021-12-16 15:17  Eason_AC  阅读(49)  评论(0)    收藏  举报