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;

浙公网安备 33010602011771号