题目链接: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;
}