Submission #1368840

#TimeUsernameProblemLanguageResultExecution timeMemory
1368840mhn_neekBootfall (IZhO17_bootfall)C++20
100 / 100
135 ms18676 KiB
//In the name of God
#include<bits/stdc++.h>
using namespace std;
typedef long long int lli;
typedef long double ld;
typedef pair<lli,lli> pii;
typedef pair<pii,pii> piiii;
typedef vector<lli> ve;
typedef vector<pii> vp;
const lli N=3e5+100;
const lli mod=1e9+7;//998244353;//1e9+9
const lli INF=1e18;
lli power(lli x,lli y){lli res = 1;x = x % mod;while(y>0){if( y & 1 ){res = (res * x) % mod;}y = y >> 1;x = (x * x)%mod;}return res;}
lli modinv(lli x){return power(x,mod-2);}
lli divide(lli x,lli y){return ((x%mod) * modinv(y))%mod;}
#define all(v) v.begin(),v.end()
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define migmig ios_base::sync_with_stdio(false),cout.tie(0), cin.tie(0);
#define read freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
#define minheap priority_queue<pair<lli,pii>, std::vector<pair<lli,pii>>, std::greater<pair<lli,pii>>>
#define set_preci(x) cout << fixed << setprecision(x);
#define debug(x) cerr << (#x) << " " << (x) << endl
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define SUM(v) accumulate(v.begin(),v.end(), 0LL)
#define FOR(x,n) for(lli x = 0; x < n; x++)
#define FORS(x,n) for(lli x = 1; x <= n; x++)
#define TEST int TQPWIEJR; cin>>TQPWIEJR;while(TQPWIEJR--)
#define BN(l,a) while(l){a.PB(l%2);l/=2;}
#define lb lower_bound
#define ub upper_bound
#define endl "\n"
#define sep " "
#define SZ(X) (lli)X.size()
lli tmp;
bitset<250006> bt[505];
lli n,A[N];

void add(lli idx,lli x){
    bt[idx] |= (bt[idx] << x);
}

void solve(lli l,lli r,bitset<250006> f){
    if(r < l)return;
    lli mid = (l+r)/2;
    bt[mid] = f;
    bitset<250006> g = f;
    for(lli i = l; i < mid; i ++){
        add(mid,A[i]);
        f |= (f << A[i]);
    }
        
    f |= (f << A[mid]);
    solve(mid+1,r,f);


    f = g;
    f |= (f << A[mid]);
    for(lli i = mid+1; i <= r;i ++){
        add(mid,A[i]);   
        f |= (f << A[i]);
    }
    solve(l,mid-1,f);

    
    
}

int main(){
    migmig;
    cin>>n;
    lli S = 0;
    bitset<250006> g;
    g[0] = 1;
    FORS(i,n){
        cin>>A[i];
        g |= (g << A[i]);
        S += A[i];
    }
    bitset<250006> f;
    f[0] = 1;
    if(S % 2 == 1 || g[S/2] == 0){
        cout<<0<<endl;
        exit(0);
    }

    solve(1,n,f);

    ve ans;
    FORS(x,S){
        bool ok = 1;
        FORS(i,n){
            lli T = (S - A[i] + x);
            if(T % 2 == 1 || bt[i][T/2] == 0){
                ok = 0;
                break;
            }

        }
        if(ok){
            ans.PB(x);
        }
    }
    cout<<SZ(ans)<<endl;
    for(auto i : ans)cout<<i<<" ";
    cout<<endl;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...