#include "bits/stdc++.h" using namespace std; using ll = long long; ll take_two(ll n) { if (n < 2) return 0; return n * (n - 1) / 2; } ll take_three(ll n) { if (n < 3) return 0; return n * (n - 1) * (n - 2) / 6; } vector <ll> count(vector <ll> &v) { vector <ll> pref(v.size(), 0), suf(v.size(), 0); for (int i = 0; i < v.size(); i++) { if (i) pref[i] = pref[i - 1]; pref[i] += v[i]; } for (int i = (int)v.size() - 1; i >= 0; i--) { if (i != (int)v.size() - 1) suf[i] = suf[i + 1]; suf[i] += v[i]; } vector <ll> res(v.size()); for (int i = 0; i < v.size(); i++) { res[i] = (i == 0 ? 0 : pref[i - 1]) * (i == (int)v.size() - 1 ? 0 : suf[i + 1]) * v[i]; res[i] += take_two(v[i]) * (i == 0 ? 0 : pref[i - 1]); res[i] += take_two(v[i]) * (i == (int)v.size() - 1 ? 0 : suf[i + 1]); res[i] += take_three(v[i]); } return res; } void solve() { int n; cin >> n; vector <ll> v; for (int i = 0; i < n; i++) { ll a; cin >> a; if (a != 0) v.push_back(a); } n = (int)v.size(); ll sum = accumulate(v.begin(), v.end(), 0LL); ll left = 1, right = 1e6, l = -1; while (left <= right) { ll mid = (left + right) / 2; if (take_three(mid) >= sum) { l = mid; right = mid - 1; } else left = mid + 1; } auto check = [&](ll x) { ll pref = 0, S = x; for (int i = 0; i < n; i++) { ll l = 0, r = x, ans = -1; while (l <= r) { ll mid = (l + r) / 2; if (pref * mid * (S - pref - mid) + take_two(mid) * (S - mid) + take_three(mid) >= v[i]) { ans = mid; r = mid - 1; } else l = mid + 1; } if (ans == -1) return false; pref += ans; x -= ans; } return true; }; ll r = 1e6, ans = -1; while (l <= r) { ll mid = (l + r) / 2; if (check(mid)) { ans = mid; r = mid - 1; } else l = mid + 1; } cout << ans << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while (t--) solve(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include "bits/stdc++.h" using namespace std; using ll = long long; ll take_two(ll n) { if (n < 2) return 0; return n * (n - 1) / 2; } ll take_three(ll n) { if (n < 3) return 0; return n * (n - 1) * (n - 2) / 6; } vector <ll> count(vector <ll> &v) { vector <ll> pref(v.size(), 0), suf(v.size(), 0); for (int i = 0; i < v.size(); i++) { if (i) pref[i] = pref[i - 1]; pref[i] += v[i]; } for (int i = (int)v.size() - 1; i >= 0; i--) { if (i != (int)v.size() - 1) suf[i] = suf[i + 1]; suf[i] += v[i]; } vector <ll> res(v.size()); for (int i = 0; i < v.size(); i++) { res[i] = (i == 0 ? 0 : pref[i - 1]) * (i == (int)v.size() - 1 ? 0 : suf[i + 1]) * v[i]; res[i] += take_two(v[i]) * (i == 0 ? 0 : pref[i - 1]); res[i] += take_two(v[i]) * (i == (int)v.size() - 1 ? 0 : suf[i + 1]); res[i] += take_three(v[i]); } return res; } void solve() { int n; cin >> n; vector <ll> v; for (int i = 0; i < n; i++) { ll a; cin >> a; if (a != 0) v.push_back(a); } n = (int)v.size(); ll sum = accumulate(v.begin(), v.end(), 0LL); ll left = 1, right = 1e6, l = -1; while (left <= right) { ll mid = (left + right) / 2; if (take_three(mid) >= sum) { l = mid; right = mid - 1; } else left = mid + 1; } auto check = [&](ll x) { ll pref = 0, S = x; for (int i = 0; i < n; i++) { ll l = 0, r = x, ans = -1; while (l <= r) { ll mid = (l + r) / 2; if (pref * mid * (S - pref - mid) + take_two(mid) * (S - mid) + take_three(mid) >= v[i]) { ans = mid; r = mid - 1; } else l = mid + 1; } if (ans == -1) return false; pref += ans; x -= ans; } return true; }; ll r = 1e6, ans = -1; while (l <= r) { ll mid = (l + r) / 2; if (check(mid)) { ans = mid; r = mid - 1; } else l = mid + 1; } cout << ans << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while (t--) solve(); } |