[ABC397D] Cubes 题解

题意

给定一个整数 \(n\),求一对正整数 \(x,y\) 使得 \(x^3-y^3=N\)

解法

\(x=a+b\)\(y=a\),则原式变为 \((a+b)^3-a^3=N\)

因为

\[(a+b)^3-a^3=a^3+3a^2b+3ab^2+b^3-a^3=3a^2b+3ab^2+b^3 \]

所以可以枚举 \(b\),解关于 \(a\) 的一元二次方程 \(3ba^2+3b^2a+b^3-N=0\)

\[\begin{split} x^3-y^3 & =(x-y)(x^2+xy+y^2) \\ &=b(x^2+xy+y^2) \\ &>b(x^2-2xy+y^2) \\ &=b(x-y)^2 \\ &=b\cdot b^2 \\ &=b^3 \end{split} \]

所以可以得出 \(b\le \sqrt[3]{N}\le 10^6\),可接受。

为了防止溢出,将等式两边同时除以 \(b\)\(3a^2+3ba+b^2-\dfrac{N}{b}=0\)

解方程可以用二分或者求根公式

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n;

ll check(ll a,ll b,ll c){
    ll l=0,r=600000001;
    while(r-l>1){
        ll mid=l+(r-l)/2;
        if(a*mid*mid+b*mid+c<=0) l=mid;
        else r=mid;
    }
    return a*l*l+b*l+c==0?l:-1;
}

int main(){
    cin>>n;
    for(ll i=1;i*i*i<=n;i++){
        if(n%i!=0) continue;
        ll j=check(3,3*i,i*i-n/i);
        if(j>0){
            cout<<i+j<<" "<<j<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}
posted @ 2025-03-29 15:27  _CuSO4  阅读(45)  评论(0)    收藏  举报