U610469 牢高的压轴题

ooliver OI

U610469 牢高的压轴题

题目背景

这是 ooliver 与 Deepseek 的聊天记录:

---老高太强了,这怎么玩?必须削弱!

Deepseek(已深度思考114514秒)∧ 有的兄弟,有的。

---那这题咋写?

Deepseek(已深度思考0秒)∨ 系统繁忙,请稍后再试。

题目描述

周清时间到了,来看看老高为你量身定制的压轴题吧:

已知 x2+xy+y2=z (x,y,z∈Z) ,并且现在告诉你 z 的值,求 x,y 的值。

如果有多组解,输出 x 最小的那一组,如果有多组 x 最小的解决,输出 y 最小的那一组;如果无解,输出 No Answer。

输入格式

一行,一个整数 z。

输出格式

一行。

若有解,输出两个整数 x,y,用空格隔开。

若无解,输出果无解,输出 No Answer。

输入输出样例 #1

输入 #1

`12`

输出 #1

`-4 2`

输入输出样例 #2

输入 #2

`2022`

输出 #2

`No Answer`

说明/提示

分数数据范围 10pts010pts0 20pts060pts0

题解

这题是一道数学与数论结合的题目,题解只展示求解过程,层层递进的思考过程不予展示。

令 z=2i·l(2∤l),

不难发现,当 (2∤i) 时, 令 x=2i-12·m,y=2i-12·n. 原方程可列为 m2+mn+n2=2l 此时分析奇偶,不难发现: 当 m,n 同为奇或一奇一偶时,m2+mn+n2 的值为奇数, 当 m,n 同为偶时,m2+mn+n2 的值为四的倍数, 又 4∤2l 且 2∣2l, ∴ 此时原方程无解,输出No Answer即可.

而发现,当 (2∣i) 时, 令 x=2i2·m,y=2i2·n. 原方程可列为 m2+mn+n2=l 根据上方的奇偶分析可以知道,在这种情况下需要对 m,n 的值进行枚举. ∵m2+mn+n2=l ∴(m+14n)2+34n2=l ∵(m+14n)2≥0 ∴34n2≥l ∴-23n3≤n≤23n3 同理,∴-23n3≤m≤23n3 所以将 m 的值枚举并解关于 n 的一元二次方程即可。

代码如下:

#include
using namespace std;
#define int long long
signed main(){
	int nnn,x,y;
	cin>>nnn; 
	int p=0,q=nnn;
	while(q%2==0) q/=2,p++;
	if(p%2!=1){
		for(int i=ceil(-(2.0*sqrt(3*q))/3.0);i
`#include
using namespace std;
#define int long long
signed main(){
	int nnn,x,y;
	cin>>nnn; 
	int p=0,q=nnn;
	while(q%2==0) q/=2,p++;
	if(p%2!=1){
		for(int i=ceil(-(2.0*sqrt(3*q))/3.0);i0;i++){
			int m=i;
			int a=1,b=m,c=m*m-q;
			int delta=b*b-4*a*c;
			if(delta0||sqrt(delta)*sqrt(delta)!=delta) continue;
			int n=LONG_LONG_MAX;
			if((int)(-b-sqrt(delta))%2==0) n=min((int)(-b-sqrt(delta))/2,n);
			else if((int)(-b+sqrt(delta))%2==0) n=min((int)(-b+sqrt(delta))/2,n);
			else continue;
			x=m*pow(2,p/2),y=n*pow(2,p/2);
			if(m*m+m*n+n*n==q){
                cout" "
    			return 0;
            }
		}
	}
	cout"No Answer";
	return 0;
}`