设 0/1 串有 cnt 个 0,那么设 fi,j 表示操作了 i 次之后前 m 个元素中有 j 个 0。
显然有 fx,0=1,其中 x 是原串中前 m 个位置中 0 的个数。
转移有一下可能性:
- 前面的 1 与后面的 0 交换,有 (m−j)2 种方案,转移到 fi+1,j+1。
- 前面的 0 与豆面的 1 交换,有 j×(n−2×m+j) 种方案,转移到 fi+1,j−1。
- 其他的情况都不会影响,直接转移到 fi+1,j。
那么就有:
fi+1,j+1←fi+1,j+1+fi,j×(m−j)2
fi+1,j−1←fi+1,j−1×j×(n−2×m+j)
fi+1,j←fi+1,j+fi,j×(n2−(m−j)2−j×(n−2×m+j))
写出矩阵,跑矩阵快速幂,时间复杂度为 O(n3logk),其实跑不满因为 0 太多了。