1. 程式人生 > 其它 >CF17A Noldbach problem 題解

CF17A Noldbach problem 題解

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