1 条题解

  • 0
    @ 2026-3-20 16:54:19

    对于每个 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;
    }
    

    信息

    ID
    186
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    5
    已通过
    3
    上传者