题解 | #World Fragments I#
Until the Blue Moon Rises
https://ac.nowcoder.com/acm/contest/57357/H
H题题解
需要知道的知识:哥德巴赫猜想
哥德巴赫猜想的现代陈述为:任一大于5的整数都可写成三个质数之和。
由此可以得到两种情况:
1.强哥德巴赫猜想(强哥猜):即任一大于2的偶数都可写成两个质数之和;(未被证明,但是同时也没有被推翻,即在本体的范围内强哥猜成立)
2.弱哥德巴赫猜想(弱哥猜):任何一个大于5的奇数都能被表示成三个奇质数的和。(一个质数可以被多次使用);(已经被证明) 所以本题有三种情况:
1.n=1时,即A为质数时成立
2.n=2时,可以分为两种情况:1.和为偶数时,使用强哥猜。2.和为奇数时,当且仅当和-2为质数时成立,因为奇数只能由一个奇数和一个偶数相加得到,而除了二以外的偶数都不是质数,所以只能是2+a,也就是a为质数时才成立,所以减去2:
3.n>2时。此时就可以运用哥德巴赫猜想了,n=3时,只要和大于5,也就是和为6(2+2+2)时是最小的成立条件。以此类推,只要满足和大于等于2*n即可。
代码如下:
#include<bits/stdc++.h>
typedef long long ll;
int su(ll x){//判断素数
if(x==1) return 0;
for(int i=2;i<=sqrt(x);i++){
if(x%i==0) return 0;
}
return 1;
}
ll a[1010];
int main(){
ll n,he=0;bool b;
std::cin>>n;
for(int i=1;i<=n;i++){
std::cin>>a[i];
he+=a[i];
}
if(n==1){
if(su(he)) b=1;
else b=0;
}
else if(n==2){//哥德巴赫猜想的部分
if(he%2==0){//强哥猜
if(he>=4) b=1;
else b=0;
}
else{//弱哥猜
if(he>=5&&su(he-2)) b=1;
else b=0;
}
}
else{
if(he>=2*n) b=1;//此时最小就是每个数字都为2时
else b=0;
}
if(b) std::cout<<"Yes";
else std::cout<<"No";
return 0;
}