设 0/10/1 串有 cntcnt 个 00,那么设 fi,jf_{i,j} 表示操作了 ii 次之后前 mm 个元素中有 jj 个 00。

显然有 fx,0=1f_{x,0}=1,其中 xx 是原串中前 mm 个位置中 00 的个数。

转移有一下可能性:

  • 前面的 11 与后面的 00 交换,有 (m−j)2(m-j)^2 种方案,转移到 fi+1,j+1f_{i+1,j+1}。
  • 前面的 00 与豆面的 11 交换,有 j×(n−2×m+j)j\times (n-2\times m+j) 种方案,转移到 fi+1,j−1f_{i+1,j-1}。
  • 其他的情况都不会影响,直接转移到 fi+1,jf_{i+1,j}。

那么就有:

fi+1,j+1←fi+1,j+1+fi,j×(m−j)2f_{i+1,j+1}\gets f_{i+1,j+1}+f_{i,j}\times (m-j)^2

fi+1,j−1←fi+1,j−1×j×(n−2×m+j)f_{i+1,j-1}\gets f_{i+1,j-1}\times j\times(n-2\times m+j)

fi+1,j←fi+1,j+fi,j×(n2−(m−j)2−j×(n−2×m+j))f_{i+1,j}\gets f_{i+1,j}+f_{i,j}\times (n^2-(m-j)^2-j\times (n-2\times m+j))

写出矩阵,跑矩阵快速幂,时间复杂度为 O(n3log⁡k)O(n^3\log k),其实跑不满因为 00 太多了。