AtCoder Grand Contest 019 E Shuffle and Swap
本文移植自个人的原博客(原文)
题目链接
题目描述
题解
题目大意为将$A$与$B$中所有为一处的下标分别加入$a$,$b$集合,求有多少种$a$,$b$的排列满足在依次交换$A_{a_i}$,$A{b_i}$后满足$A=B$。
交换操作实际为将$A$中的$1$调整匹配到$B$中$1$的位置,所以当不存在$A_i=B_i=1$时,不论如何打乱$a$,$b$的排列,在操作后总有$A=B$。当存在$A_i=B_i=1$时,$Ai$的交换有两种情况:
$A_i$所对应的$B_i$为$1$。
$A_i$所对应的$B_i$为$0$。
在进行第一种交换后,如果与$0$进行交换后,需要在操作结束后重新交换回来。那么我们不妨从$A_i$到$B_i$连一条边,易知每一个点出度入度均不超过$1$,且根据以上结论,设$x$为$A_i=B_i=1$的个数,$y$为$A_i!=B_i \ and \ A_i=1$的个数,可知该生成图共有$y$条链,且$x$个点可以作为变换的中转节点加入$y$条链中,那么我们可设$f(i,j)$表示在前$i$条链加入$j$个节点点的方案数,转移方程如下:
f[0][0]=1; |
该DP时间复杂度为$O(n^3)$,期望得分为$1200$。
考虑进行优化,观察可知$f[i−1][j−k]×rev[k+1]$为卷积形式,可以用$NTT$进行优化,代码如下。
f[0][0]=1; |
此处观察易知,该方程实质上就是将$f$数组乘了$y$遍$rev$数组,加上快速幂优化即可通过极限数据,期望得分$1700$。
a[0]=1; |
完整代码如下
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment