제출 #1283923

#제출 시각아이디문제언어결과실행 시간메모리
1283923uroskBootfall (IZhO17_bootfall)C++20
44 / 100
109 ms2888 KiB
#include "bits/stdc++.h" using namespace std; #define int long long const int mod = 2000000009; const int maxn = 505; const int maxS = 250005; int n; int dp[maxS]; int a[maxn]; int ok[maxS]; // ok[x] = in how many rounds it is ok to add x signed main(){ cin >> n; int s = 0; for(int i = 1;i<=n;i++) cin >> a[i],s+=a[i]; dp[0] = 1; //Adding everything to knapsack for(int i = 1;i<=n;i++){ for(int j = s;j>=a[i];j--){ dp[j]+=dp[j-a[i]]; if(dp[j]>=mod) dp[j]-=mod; } } if(s%2==1){ cout<<0<<endl; return 0; } if(dp[s/2]==0){ cout<<0<<endl; return 0; } for(int i = 1;i<=n;i++){ //Deleting i from knapsack for(int j = a[i];j<=s;j++){ dp[j]-=dp[j-a[i]]; if(dp[j]<0) dp[j]+=mod; } int cursum = s-a[i]; for(int new_player = 0;new_player<=s;new_player++){ int cursum = s-a[i]+new_player; if(cursum%2==0&&dp[cursum/2-new_player]>0){ ok[new_player]++; } } //Putting i back in knapsack for(int j = s;j>=a[i];j--){ dp[j]+=dp[j-a[i]]; if(dp[j]>=mod) dp[j]-=mod; } } vector<int> ans; for(int i = 1;i<=s;i++){ if(ok[i]==n) ans.push_back(i); } cout<<ans.size()<<endl; for(int x : ans) cout<<x<< " "; cout<<endl; 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...