3 条题解

  • 0

    数学可做,设kk为最大的整数,使得k3<=xk^3<=x,根据数学的求和(平方和、立方和)公式,加上化简,可得到最终的结果为:image

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll sum1(ll n){return n*(n+1)/2;}
    ll sum2(ll n){return n*(n+1)*(2*n+1)/6;}
    ll sum3(ll n){return sum1(n)*sum1(n);}
    long long query(ll x){
    	ll k=pow(x,1.0/3);
    	if((k+1)*(k+1)*(k+1)<=x) k++;
    	ll ans=3*sum3(k-1)+3*sum2(k-1)+sum1(k-1)+k*(x-k*k*k+1);
    	return ans;
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	int q;
    	ll x;
    	cin>>q;
    	while(q--){
    		cin>>x;
    		cout<<query(x)<<"\n";
    	}
    	return 0;
    }
    
    • 0

      以自然数立方为标点,分块,因为数据单调递增,可将每一个求出的数当前缀和看待,然后就没了

      • 0
        @ 2025-5-12 13:41:08

        超时只有20分的写法

        #include<bits/stdc++.h> using namespace std; int main() { int q; cin>>q; int A[q+1]; for(int i=1;i<=q;i++)//循环次数 { int sum=0; int a; cin>>a; for(int j=1;j<=a;j++) { sum=sum+(int)(cbrt(j)); } A[i]=sum; } for(int i=1;i<=q;i++) { cout<<A[i]<<'\n'; } return 0; }

        • 1

        信息

        ID
        888
        时间
        1000ms
        内存
        512MiB
        难度
        9
        标签
        (无)
        递交数
        50
        已通过
        2
        上传者