题目描述:
给定两个整数 n 和 k,请你判断在 [2,n] 的范围内是否存在不少于 k 个质数,满足可以表示为两个相邻质数与 1 的和。
例如,19 满足条件,因为 19=7+11+1。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含两个整数 n 和 k。
输出格式
每组数据输出占一行,如果存在不少于 k 个质数满足条件则输出 YES
,否则输出 NO
。
数据范围
1≤T≤30, 2≤n≤1000, 0≤k≤1000
输入样例:
5
27 2
45 7
2 0
15 1
17 1
输出样例:
YES
NO
YES
YES
YES
思路:
题意要求判断是否存在k个质数,满足prime[i] == prime[j] + prime[j+1] + 1的条件。
这里需要用到质数的判断,可以暴力,也可以使用埃氏筛、线性筛等,可以参考之前的文章https://blog.youkuaiyun.com/inorganicy/article/details/119456365?spm=1001.2014.3001.5501。
遍历质数数组,记录符合条件的个数。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
int prime[N],vis[N];
int cnt;
void check(int n){ //线性筛质数
for(int i=2;i<=n;i++){
if(!vis[i]) prime[cnt++] = i;
for(int j=0;i*prime[j]<n;j++){
vis[i*prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
int main()
{
int t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
cnt = 0; //记得清零
check(n);
int res = 0;
for(int i=0;i<cnt;i++){
for(int j=0;j<i;j++){
if(prime[i] == prime[j] + prime[j+1] + 1) {
res++;
// cout<<prime[j]<<" "<<prime[j+1]<<'\n';
break; //找到符合条件的,直接跳出循环,找下一个质数
}
}
}
// cout<<res<<'\n';
if(res >= k) cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
return 0;
}