// Summation of Four Primes (四素数之和) // PC/UVa IDs: 110705/10168, Popularity: A, Success rate: average Level: 2 // Verdict: Accepted // Submission Date: 2011-06-11 // UVa Run Time: 0.128s // // 版权所有(C)2011,邱秋。metaphysis # yeah dot net // // 这两个猜想对于题目指定范围内的数都已经验证了,能够成立,故需要利用这两个猜想。若数 n <= // 7,则不可能拆分为 4 个素数之和,若 n 为大于等于 8 的数,当 n 为偶数时,n - 2 - 2 仍为偶 // 数,当 n 为奇数时,n - 2 - 3 为偶数,按照哥德巴赫猜想,任何大于等于 4 的偶数都可以 // 表示成 2 个素数之和。 #include <iostream> #include <cmath> using namespace std; // 判断某数是否为素数。 bool is_prime(long n) { if (n == 2) return true; if (n % 2 == 0) return false; for (int c = 3; c <= ceil(sqrt(n)); c += 2) if (n % c == 0) return false; return true; } // 将偶数拆分为 2 个素数之和。 void even(long number, long *a, long *b) { if (number == 4) { *a = 2; *b = 2; return; } for (int c = 3; c <= number / 2; c += 2) if (is_prime(c) && is_prime(number - c)) { *a = c; *b = number - c; break; } } int main(int ac, char *av[]) { long n, a, b; while (cin >> n) { if (n <= 7) { cout << "Impossible." << endl; continue; } if (n % 2) { even(n - 5, &a, &b); cout << "2 3 " << a << " " << b << endl; } else { even(n - 4, &a, &b); cout << "2 2 " << a << " " << b << endl; } } return 0; }