- P186's solution
-
题解 P186
- @ 2026-3-20 16:54:19
对于每个 ,我可以将其分解为不同 的贡献,其中 是立方根的下取整。利用数学公式计算前缀和,再结合二分查找计算立方根。
AC code:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll cube_root(ll x) {
if (x == 0) return 0;
ll k = (ll)cbrt(x + 0.5);
while (k * k * k > x) {
k--;
}
while ((k + 1) * (k + 1) * (k + 1) <= x) {
k++;
}
return k;
}
int main() {
freopen("b.in","r",stdin), freopen("b.out","w",stdout);
int q;
cin >> q;
while (q--) {
ll x;
cin >> x;
ll m = cube_root(x), sum = 0;
if (m >= 1) {
ll t = m - 1;
ll sum1 = t * (t + 1) / 2;
ll sum2 = t * (t + 1) * (2 * t + 1) / 6;
ll sum3 = sum1 * sum1;
sum = 3 * sum3 + 3 * sum2 + sum1;
sum += m * (x - m * m * m + 1);
}
cout << sum << endl;
}
return 0;
}