第三心脏

第三心脏。

给定正整数 \(a\),构造三个正整数 \(b,c,d\),使得:

  • \(\sqrt{a^2+b^2+c^2+d^2}=a \oplus b \oplus c \oplus d\)

  • \(a < b < c < d < 2^{63}\)

无解输出 \(-1\)\(1 \leq a \leq 10^9\)


输出 \(-1\),获得 \(0\) 分。

猜测一定有解,接下来我们考虑直接构造解。


原题条件等价于 \(a^2+b^2+c^2+d^2=(a \oplus b \oplus c \oplus d)^2\)

考虑对于一个 \(a\),若 \(a\) 是偶数,我们构造 \(\dfrac{a}{2}\) 的解,再将所有数乘 \(2\)

此时对于特殊性质 A,我们只需要找到一组 \(a=1\) 的解即可。

//Ad astra per aspera
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	int a=1;
	for(int b=a+1;b<=100;b++){
		for(int c=b+1;c<=100;c++){
			for(int d=c+1;d<=100;d++){
				if(a*a+b*b+c*c+d*d==(a^b^c^d)*(a^b^c^d)){
					printf("%d %d %d %d\n",a,b,c,d);
				}
			}
		}
	}
	return 0;
}

运行程序,注意到一组较小的解为 \((a,b,c,d)=(1,5,7,37)\)

也就是说,\(a = 2^k\) 时,\((a,5 \times 2^k,7 \times 2^k,37 \times 2^k)\) 是合法解。

A 性质 \(10\) 分。


考虑 \(a = a' \times 2^k\) 时,我们要找到 \(a'\) 对应的 \(b',c',d'\)

下文中,令 \(a,b,c,d\) 指代 \(a',b',c',d'\)。显然,\(a\) 是奇数。

直接构造会非常困难,我们不妨钦定一些东西。

思考一下,\(b,c,d\) 是对称的,也就是说不需要强制 \(a<b<c<d\),只要互不相同。

不妨钦定 \(a \oplus b \oplus c\) 是一个常数。

考虑 \(a \oplus b \oplus c = 0\),显然此时 \(a^2 + b^2 + c^2 + d^2 = d^2\),不可能。

那么考虑 \(a \oplus b \oplus c = 1\),显然此时 \(a^2 + b^2 + c^2 = 2d + 1\)

我们需要让 \(a^2 + b^2 + c^2\) 是奇数,此时 \(b\)\(c\) 奇偶性相同,这很有道理。

容易想到构造两个偶数。为了使异或和为 \(1\),考虑钦定 \(b = 2^p\)\(c = 2^p + a - 1\)

例如 \(a = 3\) 时,我们可以构造 \(b = 4\)\(c = 6\)

此时我们令 \(b\) 是满足条件的最小值,显然 \(d\) 在量级上就是比 \(a,b,c\) 大的。

而且当 \(a > 1\) 时,这个构造本身就满足 \(a < b < c < d\)

特判 \(a=1\) 即可。

这能想到的是人?

//Ad astra per aspera
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	long long a,b,c,d,k=0;
	scanf("%lld",&a);
	while(a%2==0){
		k++;
		a>>=1;
	}
	if(a==1){
		b=5;
		c=7;
		d=37;
	}
	else{
		b=1;
		while(b<=a){
			b<<=1;
		}
		c=a+b-1;
		d=(a*a+b*b+c*c-1)>>1;
	} 
	printf("%lld %lld %lld",b<<k,c<<k,d<<k);
	return 0;
}

第三心脏。

posted @ 2026-01-17 12:42  Oken喵~  阅读(2)  评论(0)    收藏  举报