AtCoder Regular Contest 140 D,E
D
不难发现最终的图将是若干个基环树。
先将我们已经知道的边连上。那么有些联通块已经成为基环树了,这样我们直接将答案\(+1\),在下面填数时就不考虑它们了。
否则剩下的连通块一定都是树(单个点也算树),并且每个树中恰好有一个点没有连上(即每个树中都存在且仅存在一个点\(i\),使得\(A_{i}=-1\))。
假设共有\(C\)个树,给它们依次标号\(1,2,...,C\),其大小分别是\(siz(1),siz(2),...siz(C)\)。
如果我们选择将编号为\(x_{1},x_{2},...,x_{p}\)合并成一个联通块(通过将\(A_{i}=-1\)的替换成正整数),那么方案数有\((p-1)!\times \prod_{i=1}^{p} siz(x_{i})\)种。
我们分开计算——即计算连通块大小为\(Q\)的共有多少种方案。
那么此时我们可以设\(dp_{i,j}\)为考虑前\(i\)个,并且连通块已经包含了\(j\)个树的方案数。
答案就是\(\sum_{i=1}^{C} dp_{C,i}\)。
时间复杂度为\(O(n^2)\)。
E
open problem?
首先如果\(500\times 500\)的我们构造出来了,那么所有的都可以解决(取左上角为\(1,1\),右下角为\(n,m\)的子矩阵)。
我们考虑\(x\times x\)的情况。可以发现对\([1,2,...,x]\)数组重复\(x\)次,每次将第一个放到最后一个。比如\(x=3\)时,它长成这个样子:
1 2 3
2 3 1
3 1 2
这样,所有的\(x\times x\)的矩阵我们就可以有解。但注意的是,由于我们数字最大取到\(25\),所以这个做法仅对\(n,m\leq 25\)的有用。
其实,我们还有别的\(x=3\)的矩阵,就是对行进行轮换。
2 3 1
3 1 2
1 2 3
3 1 2
1 2 3
2 3 1
所以,对于\(x\times x\)的矩阵,我们有\(x\)种不同的。
此时我们有一个思路——将很多属于这\(x\)种的矩阵拼接一下,拼成一个更大的矩阵。
并且由于\(x^2\)最大可以取到\(625\),所以我们考虑利用\(x\)时的\(x\)中矩阵构造\((x^2)\times (x^2)\)时的答案。
比如对于\(9\times 9\)的矩阵,我们可以按照下面的方法拼接:
1 1 1
1 2 3
1 3 2
其中\(1,2,3\)代表\(x=3\)时\(3\)种矩阵的编号。(就是上面列的)
但注意,形如:
a...a
. .
a...a
是不能出现在矩阵中的,相同的,
a...a
. .
b...b
和
a...b
. .
a...b
也不能出现在矩阵中,比如:
1 1
2 2
对应的\(6\times 6\)的矩阵是:
1 2 3 1 2 3
2 3 1 2 3 1
3 1 2 3 1 2
2 3 1 2 3 1
3 1 2 3 1 2
1 2 3 1 2 3
其中\(x1=1,y1=1,x2=6,y2=4\)就是一组不合法的解。因为将两列上相同的矩阵轮换两次后得到的矩阵仍然是相同的。
观察上面的\(9\times 9\)的方案:
1 1 1
1 2 3
1 3 2
它其实有规律:
第一行\(array{i,j}=(array{i,j-1}+0)\mod 3 +1\)
第二行\(array{i,j}=(array{i,j-1}+1)\mod 3 +1\)
第三行\(array{i,j}=(array{i,j-1}+2)\mod 3 +1\)
原因也很简单:我们之前分析中说,除了第一行和第一列,不能出现两个相同行或列上有轮换次数相同的矩阵。(即种类相同的矩阵)
所以我们必须错位加上一个数,第一行加\(0\),第二行加\(1\),第三行加\(2\)。
而且,对于\((x^2)\times (x^2)\),且\(x\)为合数,我们是构造不出的。因为错位后我们第一次出现相同的位置是小于\(x^2\)的。
所以,只有对于\((x^2)\times (x^2)\),且\(x\)为质数,我们才能构造出方案,方案为:
而\(x\leq 25\),且\(25\)内最大的质数为\(23\),正好\(23^2=529>500\),故我们可以构造出方案。
浙公网安备 33010602011771号