CF17A Noldbach problem 題解
阿新 • • 發佈:2021-12-16
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; }