AtCoder Beginner Contest 397-d
这道题我们可以运用双指针的想法,设两个指针分别为\(x\)和\(y\),它们的初始值都为一,每次算出\(x^3-y^3\)的值并与\(n\)的值作比较,如果\(x^3-y^3\)的值大,则说明\(y\)小了,将\(y\)加一,否则如果\(n\)的值大,则说明\(x\)小了,将\(x\)加一。如果两个条件都不满足,则代表\(x^3-y^3\)等于\(n\),满足题目条件,输出\(x\)和\(y\)作为答案,然后结束程序。如果\((x^2+xy+y^2)\)的值大于\(n\)(因为\(x^3-y^3=(x-y)(x^2+xy+y^2)\)。所以如果\((x^2+xy+y^2)\)的值大于\(n\),则代表\(n\)不能表示为\(x^3-y^3\)的形式),则输出\(-1\)。
CODE
#include<iostream>
using namespace std;
long long n;
long long qs(long long x)
{
long long l=1,r=1000000;
while(l<r)
{
long long mid=(l+r)>>1;
if((__int128)mid*mid*mid>=x) r=mid;
else l=mid+1;
}
return r;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
long long i=qs(n),j=1;
long long tj=i*i+i*j+j*j;
__int128 x;
for(;;)
{
x=(__int128)tj*(i-j);
if(x<n) tj+=2*i+1+j,i++;
else if(x>n) tj+=2*j+1+i,j++;
else
{
cout<<i<<' '<<j<<endl;
return 0;
}
if(tj>n) break;
}
cout<<-1;
return 0;
}