基础数学问题 P1469 找筷子
题目
https://www.luogu.com.cn/problem/P1469
题目分析
在描述算法三之前先普及一下位运算。
|(或)两个二进制数的或运算,即两个数的某个相同的位置上有1为1
例如: 1000101 1001111 1001111即为两个数的或运算值(对于第1,4,5,6,7位上在两个数中找得到1)
注意:若两个数的位数不相同,少的那个数用0补齐
例如: 1000111 1000111 10011 运算可以看成 0010011这两个数来运算
感性理解:对于每个位置上1为显性基因
怎样区分|与&运算:|符号像1,即1为显性基因(即或运算) &(与)与|相反,0为显性基因,不理解的看上面的内容理解
^(异或)对于每个位置上进行不进位加法(进制为二进制),即1+1=0,1+0=1,0+0=0 然后
算法三:对于两个相同的数,他们异或值为0
证明:两个相同的数转化为二进制数必然也相同,上面已经说过,对于每位上的加法,无非就两种0+0,1+1值均为零 当我们把所有输入的数异或一遍,
是不是相同的数都齐齐殉情了,这就变成了0^那个多余的数,而某个数异或0得到的值还是它本身 即ans为所有数的异或值
参考:https://www.luogu.com.cn/blog/qjmm-qjmm/solution-p1469
代码
#include<iostream> #include<algorithm> using namespace std; int list[10000002]; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int n,ans=0; cin >> n; for (int i = 0; i < n; i++) { int x; cin >> x; ans ^= x; } cout << ans; }