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;
}
posted @ 2025-03-16 10:48  CMY2013  阅读(83)  评论(0)    收藏  举报