CF 623 E. Transforming Sequence 题解

首先可以发现由于\(b_i=b_{i-1}\or a_i\),所以\(b\)一定是不减的。而要满足\(b\)递增,只需要满足\(b_i\neq b_{i-1}\)就可以了。

\(b_i\neq b_{i-1}\),则存在一个二进制位\(j\),满足\(a_i\)的第\(j\)位为1,所有\(a_k,(k<i)\)\(j\)位为\(0\)

所以我们可以把每一个二进制位看作一个物品,每一数如果在这一位上有一个1,则代表选择了这个物品。而每一个数都必须选择了一个物品,前面的都没选过。

所以若\(N>K\)则一定为0。

所以就可以想到一个dp状态,\(dp_{i,j}\)表示前i个人选择了j个的方案数。

转移也比较简单:

\[dp_{i,j}=dp_{i-1,j-z}\times C_{k-(j-z)}^z\times 2^{j-z} \]

但是这个转移是\(O(N^3)\)的没办法通过。

但是仔细观察一下这个式子,转移\(dp_{i,j}\)是和\(i\)无关的,只和\(j,z\)有关。

所以可以考虑分治,\(dp_{i,j}\)表示总共\(i\)个选择\(j\)个的方案数。

然后发现可以将\(dp_{A,j},dp_{B,z}\)合并到\(dp_{A+B,j+z}\)

\[dp_{A+B,j+z}+=dp_{A,j}\times dp_{B,z}\times 2^{j\cdot B}\times C_{z+j}^j \]

\(C_{A+B}^A\)写成分数的形式。

\[dp_{A+B,j+z}+=dp_{A,j}/j!\times dp_{B,z}/z!\times 2^{j\cdot B}\times (z+j)! \]

可以发现这个阶乘是和\(dp_{i,j}\)中的\(j\)有关的。所以可以定义一个新的\(dp'_{i,j}=dp_{i,j}/j!\)

转移就变得简单很多了。

\[dp'_{A+B,z}=\sum dp'_{A,j}\times 2^{j\cdot B}\times dp'_{A,z-j} \]

这样就有了卷积形式。

如果每次枚举\(A=\lfloor i/2\rfloor\),然后递归下去,总复杂度为\(O(N\times \log^2n)\)

由于这题模数不是ntt模数,所以需要用三个ntt模数分别计算,然后用crt合并。也可以用更快的mtt。

posted @ 2021-01-21 09:39  WWW~~~  阅读(61)  评论(0编辑  收藏  举报