大致题意:
- 求 去掉偶数个的数 之后 剩下的数 是多少(真拗口
基本思路:
-
用桶,但内存是个事
-
排序去重,但好像也存不下
-
嗯没招了...那换个思路?
-
然后想到了'^'这个东西。
-
'^'现在不是什么次方,而是位运算。
-
它的运算规则大概就是:
1^1=0,1^0=1,0^1=1,0^0=0 两个位相同为0,相异为1 1 1 1 (7) ^ 0 1 0 (2) ----------- 1 0 1 (5)
-
那么对于这道题又有什么用处呢?
-
首先肯定的是异或两个相同的数为0,那么将2 2 1 3 3 3 2 3 1给换一换位置:1 1 2 2 3 3 3 3 2,每两位异或一下,得到的是0 0 0 0 2,可以得出一个结论:只要每个数的个数都是偶数个,那么全部异或后的结果是0。再看一个式子:
0 0 0 (0) ^ 0 1 0 (2) ----------- 0 1 0 (2)
那么。。答案和代码就出来了。。
Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
ll s=0,f=1;
char c=GC;
while(c<'0'||c>'9'){if(c=='-')f=-f;c=GC;}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=GC;}
return s*f;
}
int n;
int ans;
int main(){
n=R;
for(int i=1;i<=n;++i){//一直异或,最后的结果就是落单的那个
ans^=R;
}
printf("%d",ans);
return 0;
}