AtCoder 比赛记录
作者:互联网
ARC 140
打得很烂。Rank 590,Performance 1696。
D - One to One
每个点都有恰好一个出边,所以这是一个外向基环森林。因此连通块数就等于环的个数,我们只需要求出所有方案中环的个数的总和。直接算比较难办,考虑算每个环对答案的贡献。
首先,假如忽略掉 \(A_i=-1\) 的连通块,剩下的环是一定存在的,可以预先加到答案里。然后,观察到任意一个点数为 \(k\) 的、由 \(A_i=-1\) 的连通块组成的环,都会出现在 \(n^{c-k}\) 种方案里,其中 \(c\) 是 \(A_i=-1\) 的 \(i\) 的个数。接下来就是要计算出,对于所有 \(k=1,2,\dots,c\),点数为 \(k\) 的环有多少个。
假如我们任取 \(k\) 个 \(A_i=-1\) 的 \(i\),并设它们所在的连通块大小为 \(s_1,s_2,\dots,s_k\),那么这 \(k\) 个连通块可以组成 \((k-1)!\prod_{i=1}^k s_i\) 种不同的环,且这些环的大小都是 \(k\)。所以,可以直接 dp(或者分治 fft)算出环的个数,并求出答案。
时间复杂度 \(\mathcal{O}(n^2)\)(dp)或者 \(\mathcal{O}(n\log^2 n)\)(分治 fft)。
标签:dots,AtCoder,连通,比赛,记录,fft,个数,mathcal,dp 来源: https://www.cnblogs.com/alan-zhao-2007/p/atcoder-contest.html