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