#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int Base = 2 * 1e5 + 7;
LL Pierdylion = 1e9 + 7;
LL MAXSUMA = 1e18 + 7;
LL Silnie[Base];
int t, n;
LL tab[Base];
void LiczSilnie()
{
Silnie[0] = 1;
for(int i = 1; i < Base; i++) {
if(Pierdylion / i <= Silnie[i - 1]) Silnie[i] = Pierdylion;
else {
Silnie[i] = Silnie[i - 1] * i;
}
}
}
LL Ile(LL Lewo, LL Wszystko, LL x)
{
LL Wyn = 0;
if(x == 0) return 0;
if(x < 3) {
Wyn += (((MAXSUMA / max(Lewo, LL(1))) / max(x, LL(1)) <= (Wszystko - Lewo - x)) ? MAXSUMA : (Wszystko - Lewo - x) * (Lewo * x));
if(x == 2) {
Wyn += (Wszystko - x);
}
} else {
if(MAXSUMA / max((x - 1), LL(1)) <= x) return MAXSUMA;
else {
if(MAXSUMA / max((x - 1), LL(1)) <= x * (x - 1)) return MAXSUMA;
else {
Wyn += (x * ((x - 1) * (x - 2))) / 6;
Wyn += (((MAXSUMA / max(Lewo, LL(1))) / max(x, LL(1)) <= (Wszystko - Lewo - x)) ? MAXSUMA : (Wszystko - Lewo - x) * (Lewo * x));
Wyn += ((MAXSUMA / max((Wszystko - x), LL(1)) <= (x * (x - 1)) / 2) ? MAXSUMA : (Wszystko - x) * ((x * (x - 1)) / 2));
}
}
}
return Wyn;
}
bool Spr(LL x)
{
LL PoLewej = 0;
LL pocz = 1, kon = x;
LL Odp;
for(int i = 0; i < n; i++) {
if(tab[i] == 0) continue;
pocz = 1; kon = x - PoLewej;
if(kon <= 0) return 0;
while(1) {
Odp = Ile(PoLewej, x, (pocz + kon) / 2);
if(pocz >= kon - 1) {
if(Odp >= tab[i]) {
PoLewej += pocz;
break;
} else if(Ile(PoLewej, x, kon) >= tab[i]) {
PoLewej += kon;
break;
} else {
return 0;
}
}
if(Odp >= tab[i]) kon = (pocz + kon) / 2;
else pocz = (pocz + kon) / 2;
}
}
return 1;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
// LiczSilnie();
cin >> t;
LL pocz, kon;
bool czy;
for(int z = 0; z < t; z++) {
cin >> n;
for(int i = 0; i < n; i++) {
cin >> tab[i];
}
pocz = 3; kon = MAXSUMA;
while(1) {
czy = Spr((pocz + kon) / 2);
if(pocz >= kon - 1) {
if(czy) {
cout << pocz << "\n";
break;
} else {
cout << kon << "\n";
break;
}
}
if(czy) kon = (pocz + kon) / 2;
else pocz = (pocz + kon) / 2;
}
}
}
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <bits/stdc++.h> using namespace std; typedef long long LL; const int Base = 2 * 1e5 + 7; LL Pierdylion = 1e9 + 7; LL MAXSUMA = 1e18 + 7; LL Silnie[Base]; int t, n; LL tab[Base]; void LiczSilnie() { Silnie[0] = 1; for(int i = 1; i < Base; i++) { if(Pierdylion / i <= Silnie[i - 1]) Silnie[i] = Pierdylion; else { Silnie[i] = Silnie[i - 1] * i; } } } LL Ile(LL Lewo, LL Wszystko, LL x) { LL Wyn = 0; if(x == 0) return 0; if(x < 3) { Wyn += (((MAXSUMA / max(Lewo, LL(1))) / max(x, LL(1)) <= (Wszystko - Lewo - x)) ? MAXSUMA : (Wszystko - Lewo - x) * (Lewo * x)); if(x == 2) { Wyn += (Wszystko - x); } } else { if(MAXSUMA / max((x - 1), LL(1)) <= x) return MAXSUMA; else { if(MAXSUMA / max((x - 1), LL(1)) <= x * (x - 1)) return MAXSUMA; else { Wyn += (x * ((x - 1) * (x - 2))) / 6; Wyn += (((MAXSUMA / max(Lewo, LL(1))) / max(x, LL(1)) <= (Wszystko - Lewo - x)) ? MAXSUMA : (Wszystko - Lewo - x) * (Lewo * x)); Wyn += ((MAXSUMA / max((Wszystko - x), LL(1)) <= (x * (x - 1)) / 2) ? MAXSUMA : (Wszystko - x) * ((x * (x - 1)) / 2)); } } } return Wyn; } bool Spr(LL x) { LL PoLewej = 0; LL pocz = 1, kon = x; LL Odp; for(int i = 0; i < n; i++) { if(tab[i] == 0) continue; pocz = 1; kon = x - PoLewej; if(kon <= 0) return 0; while(1) { Odp = Ile(PoLewej, x, (pocz + kon) / 2); if(pocz >= kon - 1) { if(Odp >= tab[i]) { PoLewej += pocz; break; } else if(Ile(PoLewej, x, kon) >= tab[i]) { PoLewej += kon; break; } else { return 0; } } if(Odp >= tab[i]) kon = (pocz + kon) / 2; else pocz = (pocz + kon) / 2; } } return 1; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); // LiczSilnie(); cin >> t; LL pocz, kon; bool czy; for(int z = 0; z < t; z++) { cin >> n; for(int i = 0; i < n; i++) { cin >> tab[i]; } pocz = 3; kon = MAXSUMA; while(1) { czy = Spr((pocz + kon) / 2); if(pocz >= kon - 1) { if(czy) { cout << pocz << "\n"; break; } else { cout << kon << "\n"; break; } } if(czy) kon = (pocz + kon) / 2; else pocz = (pocz + kon) / 2; } } } |
English