- P26's solution
-
题解 P26
- @ 2026-1-4 18:30:57
按题意直接模拟即可。
AC code:
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> primes;
bool is_prime[301] = {false};
for (int i = 2; i <= 300; ++i) {
if (!is_prime[i]) {
if (i != 2) {
primes.push_back(i);
}
for (int j = i * i; j <= 300; j += i) {
is_prime[j] = true;
}
}
}
int n, m;
cin >> n >> m;
vector<vector<int> > result;
vector<int> path;
function<void(int, int, int)> backtrack = [&](int k, int sum, int start) {
if (k == n) {
if (sum == m) {
result.push_back(path);
}
return;
}
if (start + (n - k) > primes.size()) {
return;
}
int remain = n - k;
int min_remain = 0;
for (int i = 0; i < remain; ++i) {
if (start + i >= primes.size()) {
min_remain = INT_MAX;
break;
}
min_remain += primes[start + i];
}
if (sum + min_remain > m) {
return;
}
if (sum > m) {
return;
}
for (int i = start; i < primes.size(); ++i) {
int current = primes[i];
if (path.empty() || current > path.back()) {
path.push_back(current);
backtrack(k + 1, sum + current, i + 1);
path.pop_back();
}
}
};
backtrack(0, 0, 0);
if (result.empty()) {
cout << "No Answer." << endl;
} else {
cout << result.size() << endl;
for (const auto& combo : result) {
for (size_t i = 0; i < combo.size(); ++i) {
if (i > 0) {
cout << " ";
}
cout << combo[i];
}
cout << endl;
}
}
return 0;
}