题解 CF17A 【Noldbach problem】
题目要求的是一个素数与它相邻的素数之和\(+1\)为素数(注意这个素数要\(\le n\))
思路:
-
预处理\(2\)~\(n\)的素数
-
暴力枚举
Code
#include<bits/stdc++.h>
using namespace std;
int p[1010],len,n,sum,k;
bool prime(int num)//素数判断
{
if(num<2) return 0;
if(num==2 or num==3) return 1;
if(num%6!=5 and num%6!=1) return 0;
for(int i=5;i*i<=num;i+=6)
{
if(num%i==0 or num%(i+2)==0)
return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=2;i<=n;i++)//预处理
{
if(prime(i))
p[++len]=i;
}
for(int i=2;i<=len;i++)//枚举
{
if(prime(p[i-1]+p[i]+1) and p[i-1]+p[i]+1<=n)
sum++;
}
cout<<(sum>=k?"YES":"NO");//相当于if(sum>=k) cout<<"YES";else cout<<"NO";
return 0;
}
用时:\(1024ms\)
我们可以在原来的程序做一些小小的优化
对枚举部分,我们加入一个边界条件
\(p[i-1]+p[i] \le n\)(\(p[i]\)为素数)
Code
#include<bits/stdc++.h>
using namespace std;
int p[1010],len,n,sum,k;
bool prime(int num)
{
if(num<2) return 0;
if(num==2 or num==3) return 1;
if(num%6!=5 and num%6!=1) return 0;
for(int i=5;i*i<=num;i+=6)
{
if(num%i==0 or num%(i+2)==0)
return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=2;i<=n;i++)
{
if(prime(i))
p[++len]=i;
}
for(int i=2;i<=len and p[i-1]+p[i]+1<=n;i++)//边界条件
{
if(prime(p[i-1]+p[i]+1))
sum++;
}
cout<<(sum>=k?"YES":"NO");
return 0;
}
用时:\(994ms\) (\(emmm\)才快了\(30ms\))