第三心脏
给定正整数 \(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\)。
猜测一定有解,接下来我们考虑直接构造解。
原题条件等价于 \(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 = 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;
}

浙公网安备 33010602011771号