Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- #include <string>
- #include <functional>
- #include <cassert>
- #include <cstdlib>
- std::string solve(const std::vector<int>& a) {
- const int n = a.size();
- int sum = 0;
- for (auto& it : a) {
- assert(it >= 0);
- sum += it;
- }
- assert(0 <= sum && sum <= 1e9);
- if (sum == 0) {
- return std::string(n, '1');
- }
- std::function<bool(int, int)> is_possible = [&](int number, const int dir) {
- const int need_sum = sum / number;
- assert(need_sum * number == sum);
- int curr_sum = 0, i = 0;
- do {
- curr_sum += a[i];
- if (curr_sum > need_sum) {
- return false;
- } else if (curr_sum == need_sum) {
- --number;
- curr_sum = 0;
- }
- i += dir;
- if (i < 0) {
- i += n;
- }
- if (i >= n) {
- i -= n;
- }
- } while (number && i != 0);
- assert(curr_sum == 0);
- return true;
- };
- std::string answ(n, '0');
- for (int i = 1; i * i <= sum; ++i) {
- const int j = sum / i;
- if (j * i == sum) {
- if (i <= n) {
- answ[i-1] += (is_possible(i, 1) || is_possible(i, -1));
- }
- if (j <= n && j != i) {
- answ[j-1] += (is_possible(j, 1) || is_possible(j, -1));
- }
- }
- }
- return answ;
- }
- int main() {
- int n;
- scanf("%d", &n);
- std::vector<int> a(n);
- for (auto& it : a) {
- scanf("%d", &it);
- }
- printf("%s\n", solve(a).c_str());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment