PrimesSum

CODE BY antovip123@gmail.com
mail@pastecode.io avatar
unknown
c_cpp
3 years ago
1.6 kB
1
Indexable
Never
/* 
   Bài tập: Kiểm tra xem số n<10^9 có phân tích được tổng của các số nguyên tố khác nhau không?
            Nếu có ghi ra cách phân tích gồm các số hạng nguyên tố ở đầu nhỏ nhất có thế.
            Nếu không có in ra "invalid".
   CODE BY antovip123@gmail.com
*/
#include<bits/stdc++.h>
std::vector<int> a;
void primeArr(int n, std::vector<int> &a) {
    std::vector<bool> v(n);
    for(int i=1; i<n; i++) {
        v[i] = true;
    }
    for(int i=2; i<=n; i++)
    if(v[i]) {
        for(int j=2; j<=n/i; j++)
            v[i*j] = false;
    }
    for(int i=2; i<=n; i++)
        if(v[i])
            a.push_back(i);
}
bool primeCheck(int n) {
    if(n<2) return false;
    for(int i=2; i<=sqrt(n); i++)
        if(n%i == 0)
        return false;
    return true;
}
bool check(int n, int i) {
    //std::cout<<a[i]<<' ';
    if(n<2) return false;
    if(primeCheck(n) && (n>a[i] || i == -1)) {
        if(i != -1) std::cout<<n<<'+';
        return true;
    }
    for(int j = i+1; j<a.size(); j++)
        if(check(n-a[j], j)) {
            std::cout<<a[j];
            if(j>0) std::cout<<'+';
            else std::cout<<'\n';
            return true;
        }
    //std::cout<<'\n';
    return false;
}
int main() {
    int k = 100000;
    primeArr(k, a);
//    for(int i=0; i<a.size(); i++)
//        std::cout<<a[i]<<' ';
    int n;
    std::cin>>n;
    if(!check(n, -1)) std::cout<<"invalid";
    else std::cout<<"valid";
    return 0;
}