返回顶部

新疆大学ACM新生赛(公开赛) E.异或 (思维,位运算)

  • 题意:RT

  • 题解: \(i\ mod \ k=0\),即所有事\(k\)的倍数的位置都要进行异或,根据异或的性质,我们知道如果相同的异或的数个数是偶数的话,得出的结果是\(0\),所以每次询问,我们判断需要进行异或的个数,如果不是奇数的话就不用求贡献,这儿还有个结论,如果我们原来有偶数的个数,然后进行一次异或操作后变成了奇数,那么这次操作得到的贡献就是\(v\),因为假设原来偶数位置的数是\(x\),那么我们对这些位置操作后得到\(x\)^\(v\),因为变成了奇数,所以我们在求总贡献的时候,多了一个\(x\)\(x\) ^ \(v\),它们异或的结果就是\(v\),所以每次询问的时候可以用\(sum\)^\(=v\)来表示.

  • 代码:

    int n,q;
    int sum;
    int a[N];
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>n>>q;
        while(q--){
            int k,v;
            cin>>k>>v;
            if(k<=n) a[k]^=v;
            if((n/k)&1) sum^=v;
            cout<<sum<<endl;
        }
        for(int i=n;i>=1;--i){
            for(int j=i+i;j<=n;j+=i){
                a[j]^=a[i];
            }
        }
        for(int i=1;i<=n;++i){
            cout<<a[i]<<" ";
        }
    
        return 0;
    }
    
posted @ 2020-10-12 20:48  _Kolibri  阅读(179)  评论(0)    收藏  举报