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

浙公网安备 33010602011771号