#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
const int MAX = 500 * 500 + 5;
int n, sum = 0;
int a[maxn];
bitset<MAX> dpWithout[maxn];
void dnc(int l, int r, bitset<MAX> curr)
{
if (l == r)
{
dpWithout[l] = curr;
return;
}
int mid = (l + r) / 2;
bitset<MAX> dpL = curr;
for (int i = l; i <= mid; ++i)
{
dpL |= (dpL << a[i]);
}
dnc(mid + 1, r, dpL);
bitset<MAX> dpR = curr;
for (int i = mid + 1; i <= r; ++i)
{
dpR |= (dpR << a[i]);
}
dnc(l, mid, dpR);
}
void fastIO()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int main()
{
fastIO();
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
sum += a[i];
}
bitset<MAX> dp;
dp.reset();
dp[0] = 1;
for (int i = 1; i <= n; ++i)
{
dp |= (dp << a[i]);
}
if (sum % 2 == 1 || dp[sum / 2] != 1)
{
cout << 0 << endl;
return 0;
}
dp.reset();
dp[0] = 1;
dnc(1, n, dp);
vector<int> whichDiffs;
vector<bool> isPossible;
for (int i = 1; i <= n; ++i)
{
dp = dpWithout[i];
if (i == 1)
{
for (int j = 0; j <= (sum - a[i]) / 2; ++j)
{
if (dp[j] == 1)
{
whichDiffs.push_back((sum - a[i]) - 2 * j);
}
}
isPossible.resize(whichDiffs.size());
for (int j = 0; j < isPossible.size(); ++j)
{
isPossible[j] = true;
}
}
else
{
for (int j = 0; j < whichDiffs.size(); ++j)
{
int d = whichDiffs[j];
if ((sum - a[i] - d) < 0) isPossible[j] = false;
else if ((sum - a[i] - d) % 2 == 1) isPossible[j] = false;
else if (dp[(sum - a[i] - d) / 2] == false) isPossible[j] = false;
}
}
}
vector<int> ans;
for (int i = 0; i < whichDiffs.size(); ++i)
{
if (isPossible[i]) ans.push_back(whichDiffs[i]);
}
sort(ans.begin(), ans.end());
cout << ans.size() << endl;
for (auto d : ans) cout << d << " ";
cout << endl;
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... |