#include <bits/stdc++.h>
using i64 = long long;
#ifdef DEBUG
#include "debug.h"
#else
#define debug(...) void(23)
#endif
constexpr int max_N = int(100) + 5;
constexpr int max_A = max_N;
constexpr int UB = max_N * max_A;
using B = std::bitset<UB>;
std::bitset<UB> pre[max_N], suf[max_N];
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int N;
std::cin >> N;
std::vector<int> A(N + 1);
for (int i = 0; i < N; ++i) {
std::cin >> A[i];
}
bool bo[2] {};
for (int i = 0; i < N; ++i) {
bo[A[i] & 1] = true;
}
if (bo[0] && bo[1]) {
std::cout << "0\n";
return 0;
} else if (N == 1) {
std::cout << "0\n";
return 0;
}
pre[0][0] = true;
for (int i = 0; i < N; ++i) {
pre[i + 1] = pre[i] | (pre[i] << A[i]);
}
suf[N][0] = true;
for (int i = N - 1; i >= 0; --i) {
suf[i] = suf[i + 1] | (suf[i + 1] << A[i]);
}
N++;
int sum = std::accumulate(A.begin(), A.end(), 0);
auto check = [&]() -> bool {
for (int i = 0; i < N - 1; ++i) {
int nsum = sum - A[i];
if (nsum & 1) {
return false;
}
int need = nsum >> 1;
bool good = false;
for (int k = 0; k <= need; ++k) {
if (pre[i][k] && suf[i + 1][need - k]) {
good = true;
break;
}
if (k <= need - A[N - 1] && pre[i][k] && suf[i + 1][need - k - A[N - 1]]) {
good = true;
break;
}
}
if (!good) {
return false;
}
}
return true;
};
std::vector<int> ans;
for (int i = bo[0] ? 0 : 1; i <= sum; i += 2) {
A[N - 1] = i;
if (~sum & 1 && pre[N - 1][sum >> 1]) {
sum += i;
if (check()) {
ans.emplace_back(i);
}
sum -= i;
}
A[N - 1] = 0;
}
std::cout << ans.size() << '\n';
for (auto i : ans) {
std::cout << i << " \n"[i == ans.back()];
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |