原题链接
这道题我们可以运用双指针的想法,设两个指针分别为\(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;
}