Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include<iostream>
- #include <algorithm>
- #include <cmath>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <set>
- #include <deque>
- #include <queue>
- #include <map>
- #include <bitset>
- #include <random>
- #include <cassert>
- #include <unordered_map>
- #include <unordered_set>
- #include<math.h>
- using namespace std;
- typedef unsigned int ui;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- #define endl "\n"
- #define all(a) a.begin(), a.end()
- #define allr(a) a.rbegin(), a.rend()
- #define pb push_back
- #define pikachu push_back
- #define F first
- #define S second
- void solve() {
- ll n,sum_now=0;
- cin >> n;
- vector<ll> a(n),dp(30000,0);
- dp[0] = 1;
- for (ll i = 0; i < n; i++){
- cin >> a[i];
- for (ll j = sum_now; j >= 0; j--)
- dp[j + a[i]] += dp[j];
- sum_now += a[i];
- }
- if (sum_now&1){
- cout << 0 << endl;
- return;
- }
- if (!dp[sum_now / 2]) {
- cout << 0 << endl;
- return;
- }
- vector<bool> ban_ans(25001, false),used(501,false);
- for (ll i = 0; i < n; i++) {
- if (!used[a[i]]) {
- used[a[i]] = true;
- sum_now -= a[i];
- for (ll j = 0; j <= sum_now; j++)
- dp[j + a[i]] -= dp[j];
- for (ll j = 1; j <= 25000; j++) {
- if ((sum_now + j) & 1)
- ban_ans[j] = true;
- if (!dp[(sum_now + j) / 2])
- ban_ans[j] = true;
- }
- for (ll j = sum_now; j >= 0; j--)
- dp[j + a[i]] += dp[j];
- sum_now += a[i];
- }
- }
- vector <ll> ans;
- for (ll i = 1; i <= 25000; i++)
- if (!ban_ans[i]) ans.pb(i);
- cout << ans.size() << endl;
- for (ll& i : ans) {
- cout << i << ' ';
- }
- }
- signed main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- ll t = 1;
- //cin >> t;
- //cout << fixed << setprecision(18);
- while (t--) {
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement