第五题 - MANY OPERATIONS
题目跳转:宏量运算。
一道位运算的恶心题目,跟上一题一样,可以用前缀和动态规划的思想来解决。因为每一位都是相互独立的,所以只需要按位进行 dp\mathtt{dp}dp 预处理就可以了。定义状态 dpi,j(0/1),kdp_{i, j(0/1), k}dpi,j(0/1),k 表示对于第 iii 位来说,一开始的值为 j(0/1)j(0/1)j(0/1),经过前 kkk 次操作后这一位的值。而状态转移方程就是 dpi,j,k=dpi,j,k−1dp_{i, j, k} = dp_{i, j, k-1}dpi,j,k =dpi,j,k−1 。之后不断迭代就可以求出最后的解。
本题的主要难点是位运算的一些操作,有些同学对位运算的操作不太熟悉,这里提供一些常见的位运算操作:
1. 获取一个数字的第 jjj 位:(x >> j) & 1。
2. 判断数字是否是奇数:x & 1。
3. 将一个数字乘上 2j2^j2j:(1 << j) * x。
本题的时间复杂度约为 Θ(60N)\Theta(60N)Θ(60N)。
因此,本题的 AC 代码如下: