题目链接:
题目要求:
给一个 测试样例数 t;
给一个 正整数 n;
找到 任意三个 整数 a,b,c 使得 a^b + b^c + a^c == n;
如果存在这么三个数,那么输出 a b c
否则输出 -1;
必备知识:
异或操作 即 ^ 是按照 对应 二进制 进行的 操作
当两数同一位置不同时 为 1
当两数同一位置相同时 为 0
举例说明:
3的二进制:0011
2的二进制:0010
1的二进制:0001
根据异或操作可得:
3^2 == 2^3 == 1
3^1 == 1^3 == 2
2^1 == 1^2 == 3
那么我们可以得到以下一些知识:
1. a^b == b^a
2. 如果 a^b == c 那么 a^c == b
3.a^a == 0
4.a^0 == a
题目分析:
任意 a b c 两两异或之和 为 n
如果 n 存在 那么 n 为 偶数
证明如下:
不论a b c 为正数 还是 负数
if(a%2== 0) 则 a 为一个偶数 则 a 对应的二进制的最后一位 为 0
if(a%2== 1) 则 a 为一个奇数 则 a 对应的二进制的最后一位 为 1
所以有如下四种情况
1. 全为 奇数 即3个奇数 0个偶数
a = xxx1
b = yyy1
c = zzz1
两两 异或之和 的二进制 最后一位 为 0+0+0 == 0 ,那么这个数是偶数
2. 2个奇数 1个偶数
a = xxx1
b = yyy1
c = zzz0
两两 异或之和 的二进制 最后一位 为 0+1+1 == 0 ,那么这个数是偶数
3. 1个奇数 2个偶数
a = xxx1
b = yyy0
c = zzz0
两两 异或之和 的二进制 最后一位 为 1+1 +0 == 0 ,那么这个数是偶数
4. 全为偶数 即 0个奇数 3个偶数
a = xxx0
b = yyy0
c = zzz0
两两 异或之和 的二进制 最后一位 为 0+0+0 == 0 ,那么这个数是偶数
所以 n 一定是偶数
核心代码
if(n%2==0){
cout<<1<<' '<<1<<' '<< ((n/2)^1)<<endl;
}else{
cout<<-1<<endl;
}
为什么 将 a b 特取 为 1 呢
因为 这样一来 a^b == 0
a^c == b^c == n/2