auto check = [&](int l, int r) -> std::pair<i64, i64> { i64 S = 0; for (int i = l; i <= r; i++) { S += A[i]; } auto [d, m, ks] = invgcd(R, D, S); if (m == -1) { return {inf, inf}; } if (m == 0) { m = D / d; ks -= R / d; } return {m, ks}; };
std::vector f(N, std::vector<int>(N, 0)); for (int len = 1; len <= N; len++) { for (int l = 0; l + len - 1 < N; l++) { int r = l + len - 1; for (int k = l; k < r; k++) { f[l][r] = std::max(f[l][r], f[l][k] + f[k + 1][r]); } auto [m, ks] = check(l, r); if (f[l][r] >= m - 1) { f[l][r] = m; } } }
std::vector<i64> g(N + 1, -1); g[0] = 0; for (int r = 0; r < N; r++) { g[r + 1] = g[r]; for (int l = 0; l <= r; l++) { auto [m, ks] = check(l, r); if (f[l][r] >= m) { g[r + 1] = std::max(g[r + 1], g[l] + ks); } } } std::cout << g[N] << "\n";