在其余数都出现3次,找到恰好出现一次的那个数
分析:考虑一下答案,因为n-1个数中每个数都会出现3次,那么这些数对应的二进制为也就是出现3次
剩下那个是只出现一次,举个栗子 n=4 3 3 3 1
那么二进制表示
11
11
11
01
也就是说,找到二进制下%3意义下出现1次的那些二进制,模拟一下就ok 复杂度O(n*32)
不过可以考虑简化一下,增加一个变量模拟一下%3的过程,先只考虑一个二进制位,如何实现%3的+
0 0
1 0
0 1
0 0
大致就是表示,even=odd&1 odd^=1 p=~(even&odd) even&=p odd&=p
然后把这个结论扩展到32位就行了
#include<iostream> #define rep(i,a,b) for(int i=a;i<=b;i++) #define per(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int maxn=1e5+5; int n,val; int main(){ cin>>n; int even=0,odd=0; rep(i,1,n){ cin>>val; even|=odd&val; odd^=val; int p=~(odd&even); even&=p; odd&=p; } cout<<odd<<endl; return 0; }