D -cubes

题目链接:https://atcoder.jp/contests/abc397/tasks/abc397_d

题意:

求出正整数对(x,y)对于给定的n=x*x*x-y*y*y;

思路:

因氏分解,将给定式子转化为(x-y)(x*x+x*y+y*y)

发现这两个因式都为n的因数
不妨令左边一项等于a,右边一项等于b
易知:b>=(x-y)^2 => b>=a^2

n= a*b>=a^3

所以a在n的立方根里枚举(n最大取1e18)
时间复杂度可行
然后解方程+求根公式
注意每次运算都要保证是整数
对于证明开方数为整数:sq=sqrt(n)
只要sq*sq=n,开方即为整数,可以往下运算

int x,y;
int a,b;
void solve(){
	int n;cin>>n;
	for(int i=1;i*i*i<=n;i++){
		if(n%i!=0)continue;
		
		a=i;
		b=n/a;
		if(b<a*a)continue;
		if((b-a*a)%3!=0)continue;
		int c=(b-a*a)/3;
		int d=a*a+4*c;
		int sq=sqrt(d);
		if(sq*sq!=d||(-a+sq)%2!=0)continue;
		
		y=(-a+sq)/2;x=y+a;
	}
	if(x<=0||y<=0){
		cout<<-1<<endl;
	}else cout<<x<<' '<<y<<endl;
}
posted @ 2025-03-17 20:55  Marinaco  阅读(40)  评论(0)    收藏  举报
//雪花飘落效果