제출 #77115

#제출 시각아이디문제언어결과실행 시간메모리
77115zetapiBootfall (IZhO17_bootfall)C++14
44 / 100
1002 ms3996 KiB
#include "bits/stdc++.h"
using namespace std;

#define pb  push_back
#define mp  make_pair
#define ll  long long
#define int long long
#define itr iterator

typedef pair<ll,ll> pii;

const ll MAX=3e5+9;
const ll LIM=3e5;
const ll mod=1e9+7;

bitset<LIM> bs;

ll N,sum,arr[MAX],dp[MAX];

void TakeMod(ll &X,ll Y)
{
	while(X<0)
		X+=Y;
	while(X>=Y)
		X-=Y;
	return ;
}

void add(ll X)
{
	sum+=X;
	for(int A=LIM;A>=X;A--)
	{
		dp[A]+=dp[A-X];
		TakeMod(dp[A],mod);
	}
	return ;
}

void remove(ll X)
{
	sum-=X;
	for(int A=X;A<LIM;A++)
	{
		dp[A]-=dp[A-X];
		TakeMod(dp[A],mod);
	}
	return ;
}

signed main()
{
	ios_base::sync_with_stdio(false);

	dp[0]=1;
	cin>>N;
	for(int A=1;A<=N;A++)
	{
		cin>>arr[A];
		add(arr[A]);
	}
	if(sum%2 or (!dp[sum/2]))
		return cout<<0,0;
	for(int A=1;A<=LIM;A++)
		bs[A]=1;
	for(int A=1;A<=N;A++)
	{
		remove(arr[A]);
		for(int B=1;B<=LIM;B++)
			if(B>sum or (sum+B)%2 or (!dp[(sum+B)/2]))
				bs[B]=0;
		add(arr[A]);
	}
	vector<int> vec;
	for(int A=1;A<=sum;A++)
		if(bs[A])
			vec.pb(A);
	cout<<vec.size()<<"\n";
	for(auto A:vec)
		cout<<A<<" ";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...