在其余数都出现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;
}

  

 

posted @ 2017-06-05 10:04  N维解析几何  阅读(344)  评论(0编辑  收藏  举报