原题解链接:https://ac.nowcoder.com/discuss/827158

给出两种构造方式:

  • 考虑 dd 的每一位,如果当前位为 00,则不对答案产生影响;如果当前位为 11,又因为 1 xor 1 xor 0=0,1&nbs***bsp;1&nbs***bsp;0=11\text{ xor }1\text{ xor }0=0,1\text{ or }1\text{ or }0=1,所以把 a,b,ca,b,c 其中两个按位或上 2i2^i 即可。
  • {a=db=lowbit(d)c=d xor lowbit(d)\begin{cases}a=d\\b=\text{lowbit}(d)\\c=d\text{ xor }\text{lowbit}(d)\end{cases}

当然这两种方式并无什么不同。无解的情况是 d=2nd=2^n

#include<bits/stdc++.h>
int ans[3],d;
signed main() {
	scanf("%d",&d);
	if((d&-d)==d)	return puts("-1"),0;
	for(int now=0; d; d^=d&-d)	ans[now]|=d&-d,ans[(now+=1)%=3]|=d&-d;
	printf("%d %d %d\n",ans[0],ans[1],ans[2]);
	return 0;
}
#include<bits/stdc++.h>
int d;
signed main() {
	scanf("%d",&d);
	if((d&-d)==d)	return puts("-1"),0;
	printf("%d %d %d\n",d,(d&-d),d-(d&-d));
	return 0;
}