In mathematics you don't understand things, you just get used to them.

la traduction.

link。

如果我们对于每一个 $k\in[0,n]$ 找到所有满足存在 $k$ 个 $i$ 使得 $r_i=p_i$ 或 $r_i=q_i$ 条件的排列数量,我们就可以解决此题。

钦定 $i_1,\dots,i_k$ 使得对于每一个 $j$,满足 $r_{i_j}=p_{i_j}$。让我们来找到位置 $i_j$ 能填的数的数量。

对于每一个 $j$,我们把 $(p_{i_j},q_{i_j})$ 看作一条边。我们可以计算「每条边钦定一个点,并且没有两条边钦定同一个点」方案数。

考虑每一个非自环非独立点的连通块,显然每个点的度数 $\leqslant2$,那么每个连通块一定是:

  • 一个环,此时有两种方案;
  • 一条链,此时有链长度种方案。

所以方案数是他们的乘积。

现在,我们得去找到对于每一种 $i_1,\dots,i_k$ 的组合的上述的值。我们考虑一个把所有 $(p_i,q_i)$ 加入的图,并且确认对于每一个连通块,多少边被选择了。令 $K$ 为某个连通块的大小。如果我们知道对于每一个 $0\leqslant k\leqslant K$,在当前联通分量中选 $k$ 条边的时每一个 $r_i$ 的填数方案,那就可以简单 DP 解决。一下,我们假设图是一个环。

当所有的边都已经被选好,此时有两种方案。否则,此时图是一些链和孤立点的集合,方案数就是他们的大小乘积。这等价于从任意选择的边形成的每个连通分量中选择顶点并标记的方案总数,因此可以用组合数求出。在计数时,我们可以固定未使用边的最小索引,将循环视为计算中的路径。

graph theory combinatorics

「codechef - STRQUER」Strange Queries
上一篇 «
「codeforces - 990G」GCD Counting
» 下一篇