cf1614 C. Divan and bitwise operations(思维,位运算)

题意:

长为n的数组未知,只知道m个区间的或和\(l_i,r_i,x_i\) 表示 \(a_{l_i}|a_{l_i+1}|\cdots|a_{r_i}=x_i\) 。求所有子列(不必连续)的异或和之和。

思路:

若所有数的第 \(i\) 位都是0,则异或和也是0,无贡献。

若有 \(k\) 个数的第 \(i\) 位是1,则有 \(k\) 个数的第 \(i\) 位是0。1只能选奇数个,0随便选。所以有 \(2^{n-k}\sum\limits_{j为奇数}C_k^j=2^{n-k}2^{k-1}=2^{n-1}\) 个子列的异或和的第 \(i\) 位为1,答案加上 \(2^i*2^{n-1}\)

答案就是 \(2^{n-1}\sum_i 2^i\)

ll ans = 0;
while(m--) scanf("%d%d%d", &x, &x, &x), ans |= x;
cout << ans * qmi(2, n-1) % MOD;
posted @ 2021-12-22 16:13  Bellala  阅读(71)  评论(0)    收藏  举报