对于每个 xx,我可以将其分解为不同 kk 的贡献,其中 kk 是立方根的下取整。利用数学公式计算前缀和,再结合二分查找计算立方根。

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;
}