作者没看过第三心脏,所以作者猜测第三个心脏应该是用铁做的,由于铁粉是黑的,所以这道题目是黑。
养成良好习惯,不留根号,式子变为:
\[a^2+b^2+c^2+d^2=\left(a\oplus b\oplus c\oplus d\right)^2 \]
注意到 \(a\ge 1\) 所以 \(a^2+b^2+c^2+d^2>d^2\) 又注意到"第三心脏"中的"第"的音序为 \(d\) 的大写,所以考虑对 \(d\) 进行一些操作,我们设 \(a\oplus b\oplus c\oplus d=d+n\) 所以原式变为:
\[a^2+b^2+c^2+d^2=\left(d+n\right)^2 \]
养成良好习惯,当一个懒人,由于 \(n>0\) 所以考虑第二简单的情况 \(n=\pm1\) 时的情况,注意到
\[x\oplus 1=\begin{cases} x+1&\text{ if }x\equiv 0\pmod 2\\ x-1&\text{ if }x\equiv 1 \pmod 2 \end{cases}\]
那么我们考虑让 \(a\oplus b\oplus c=1\) 若 \(n=-1\) 那么 \(d\equiv 1 \pmod 2\) 将上面的式子继续化简就是:
\[a^2+b^2+c^2=2d+1 \]
其中 \(2d\equiv 2\pmod 4\) 所以右式模 \(4\) 余 \(3\),注意到完全平方数模 \(4\) 余 \(0\) 或 \(1\) 所以如果两式相等只能 \(a^2\equiv b^2\equiv c^2\equiv 1\pmod 4\) 而由于 \(a\) 给定,所以当 \(a\equiv0\pmod 2\) 时,这是无解的,作者太懒了不想继续了,所以考虑让 \(n=1\)。
考虑构造 \(a\oplus b\oplus c=1\),设 \(a=2^n+x_{n-1}2^{n-1}+\cdots+x_0\),考虑 \(b=2^{n+1}+x_{n-1}2^{n-1}+\cdots+x_0\) 这时,\(a\oplus b=2^{n+1}+2^{n}\) 我们只需要令 \(c=2^{n+1}+2^n+1\) 即可,此时 \(d=\frac{a^2+b^2+c^2-1}{2}\) 可以证明 \(d\in\mathbb{N}^{*}\) 但是,这遇到一个问题,我们的前提是 \(d\equiv 0\pmod 2\),容易发现当 \(a^2\equiv b^2\equiv c^2\equiv 1\pmod 4\) 时,\(d\equiv 1\pmod 2\),于是我们充分发挥人类智慧,这个时候我们的 \(a=2^n+x_{n-1}2^{n-1}+\cdots+1\) 发现都是最后这个常数再搞鬼!我们可以考虑 \(b=2^{n+1}+x_{n-1}2^{n-1}+\cdots+0,c=2^{n+1}+2^n\) 这个时候就好了!
随之而来 \(a=1\) 时,我们会发现一个自相矛盾的结论,这可不行,赶快手摸一组特判!
cpp
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a;
signed main(){
//freopen("","r",stdin);
//freopen("","w",stdout);
cin>>a;
if(a==1)puts("4 28 40");
else{
int n=log2(a);
int b=a-(1<<n)+(1<<(n+1)),c=(1<<n)+(1<<(n+1))+1;
if(a&1)cout<<b-1<<' '<<c-1<<' '<<((b-1)*(b-1)+(c-1)*(c-1)+a*a-1)/2;
else cout<<b<<' '<<c<<' '<<(a*a+b*b+c*c-1)/2;
}
return 0;
}
亲测可过,请勿抄袭!