https://atcoder.jp/contests/abc397/tasks/abc397_dhttps://atcoder.jp/contests/abc397/tasks/abc397_d
题目描述:
确定是否存在一对正整数
,使得
思路:
首先对方程进行转化
设
即
接下来确定的范围
根据立方差公式
因此,我们可以从到
来逐个枚举
此时 方程的就变成了常数
设 ,
,
原方程变为
这时,只需要解一下这个二次方程就可以了
提醒:
会爆long long
所以要开__int128
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
signed main(){
cin>>n;
for(int i=1;i*i*i<=n;i++){
int a=3*i,b=-3*i*i,c=i*i*i-n;
__int128 u=b,v=a;
u=u*u-4*v*c;
__int128 k=sqrtl(u);
if(k*k==u){
int xa=(-b+k),xb=(-b-k);
if(xa>0&&xa%(2*a)==0&&xa/2/a-i>0){
xa/=(2*a);
cout<<xa<<" "<<xa-i;
return 0;
}
if(xb>0&&xb%(2*a)==0&&(xb/2/a)-i>0){
xb/=(2*a);
cout<<xb<<" "<<xb-i;
return 0;
}
}
}
cout<<"-1";
return 0;
}