Submission #404450

#TimeUsernameProblemLanguageResultExecution timeMemory
404450rama_pangBootfall (IZhO17_bootfall)C++17
100 / 100
618 ms3452 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);

  int N;
  cin >> N;
  vector<int> A(N);
  for (int i = 0; i < N; i++) {
    cin >> A[i];
  }

  const int MAX = accumulate(begin(A), end(A), 0) + 5;
  const int MOD = 1e9 + 7;
  const auto Add = [&](int &a, int b) {
    a += b;
    if (a >= MOD) a -= MOD;
  };

  int sum = 0;
  vector<int> dp(MAX);

  dp[0] = 1;

  const auto Insert = [&](int a) {
    sum += a;
    for (int i = MAX - 1; i >= 0; i--) {
      if (i + a < MAX) {
        Add(dp[i + a], dp[i]);
      }
    }
  };

  const auto Delete = [&](int a) {
    sum -= a;
    for (int i = 0; i < MAX; i++) {
      if (i + a < MAX) {
        Add(dp[i + a], MOD - dp[i]);
      }
    }
  };

  for (int i = 0; i < N; i++) {
    Insert(A[i]);
  }

  if (sum % 2 != 0 || dp[sum / 2] == 0) {
    cout << 0 << '\n';
    return 0;
  }

  vector<int> ans(MAX);
  for (int i = 0; i < N; i++) {
    Delete(A[i]);
    for (int j = 1; j < MAX; j++) {
      int nsum = sum + j;
      if (nsum % 2 != 0) continue;
      int need = nsum / 2;
      if ((0 <= need - 0 && need - 0 < MAX && dp[need - 0] != 0) ||
          (0 <= need - j && need - j < MAX && dp[need - j] != 0)) {
        ans[j]++;
      }
    }
    Insert(A[i]);
  }

  vector<int> answer;
  for (int i = 1; i < MAX; i++) {
    if (ans[i] == N) {
      answer.emplace_back(i);
    }
  }

  cout << answer.size() << '\n';
  for (auto a : answer) {
    cout << a << ' ';
  }
  cout << '\n';
  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...