新疆大学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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号