#include <bits/stdc++.h>
using namespace std;
using ll = int64_t;
using i128 = __int128_t;
void solve(){
int N;
cin >> N;
vector<ll> A(N);
for(int i = 0; i < N; i++) cin >> A[i];
ll s = 0;
ll e = 1e9;
while(s + 1 < e){
ll mid = (s+e) / 2;
ll tot = mid;
bool ok = true;
ll prv = 0;
ll nleft = tot;
for(int i = 0; i < N; i++){
ll s1 = -1;
ll e1 = nleft + 1;
auto ncr3 = [&](i128 c) -> i128 {
return c * (c-1) * (c-2) / 6;
};
auto ncr2 = [&](i128 c) -> i128 {
return c * (c-1) / 2;
};
while(s1 + 1 < e1){
ll m1 = (s1 + e1) / 2;
i128 x = m1;
i128 good = ncr3(x) + ncr2(x) * (tot - x) + x * prv * (tot - x - prv);
(good >= A[i] ? e1 : s1) = m1;
}
if(e1 > nleft){
ok = false;
break;
}
prv += e1;
nleft -= e1;
}
(ok ? e : s) = mid;
}
cout << e << '\n';
}
int main(){
ios_base::sync_with_stdio(false), cin.tie(nullptr);
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 | #include <bits/stdc++.h> using namespace std; using ll = int64_t; using i128 = __int128_t; void solve(){ int N; cin >> N; vector<ll> A(N); for(int i = 0; i < N; i++) cin >> A[i]; ll s = 0; ll e = 1e9; while(s + 1 < e){ ll mid = (s+e) / 2; ll tot = mid; bool ok = true; ll prv = 0; ll nleft = tot; for(int i = 0; i < N; i++){ ll s1 = -1; ll e1 = nleft + 1; auto ncr3 = [&](i128 c) -> i128 { return c * (c-1) * (c-2) / 6; }; auto ncr2 = [&](i128 c) -> i128 { return c * (c-1) / 2; }; while(s1 + 1 < e1){ ll m1 = (s1 + e1) / 2; i128 x = m1; i128 good = ncr3(x) + ncr2(x) * (tot - x) + x * prv * (tot - x - prv); (good >= A[i] ? e1 : s1) = m1; } if(e1 > nleft){ ok = false; break; } prv += e1; nleft -= e1; } (ok ? e : s) = mid; } cout << e << '\n'; } int main(){ ios_base::sync_with_stdio(false), cin.tie(nullptr); int T; cin >> T; while(T--) solve(); } |
English