AtCoder Regular Contest 140 D,E
D
不难发现最终的图将是若干个基环树。
先将我们已经知道的边连上。那么有些联通块已经成为基环树了,这样我们直接将答案,在下面填数时就不考虑它们了。
否则剩下的连通块一定都是树(单个点也算树),并且每个树中恰好有一个点没有连上(即每个树中都存在且仅存在一个点,使得)。
假设共有个树,给它们依次标号,其大小分别是。
如果我们选择将编号为合并成一个联通块(通过将的替换成正整数),那么方案数有种。
我们分开计算——即计算连通块大小为的共有多少种方案。
那么此时我们可以设为考虑前个,并且连通块已经包含了个树的方案数。
答案就是。
时间复杂度为。
E
open problem?
首先如果的我们构造出来了,那么所有的都可以解决(取左上角为,右下角为的子矩阵)。
我们考虑的情况。可以发现对数组重复次,每次将第一个放到最后一个。比如时,它长成这个样子:
1 2 3
2 3 1
3 1 2
这样,所有的的矩阵我们就可以有解。但注意的是,由于我们数字最大取到,所以这个做法仅对的有用。
其实,我们还有别的的矩阵,就是对行进行轮换。
2 3 1
3 1 2
1 2 3
3 1 2
1 2 3
2 3 1
所以,对于的矩阵,我们有种不同的。
此时我们有一个思路——将很多属于这种的矩阵拼接一下,拼成一个更大的矩阵。
并且由于最大可以取到,所以我们考虑利用时的中矩阵构造时的答案。
比如对于的矩阵,我们可以按照下面的方法拼接:
1 1 1
1 2 3
1 3 2
其中代表时种矩阵的编号。(就是上面列的)
但注意,形如:
a...a
. .
a...a
是不能出现在矩阵中的,相同的,
a...a
. .
b...b
和
a...b
. .
a...b
也不能出现在矩阵中,比如:
1 1
2 2
对应的的矩阵是:
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
其中就是一组不合法的解。因为将两列上相同的矩阵轮换两次后得到的矩阵仍然是相同的。
观察上面的的方案:
1 1 1
1 2 3
1 3 2
它其实有规律:
第一行
第二行
第三行
原因也很简单:我们之前分析中说,除了第一行和第一列,不能出现两个相同行或列上有轮换次数相同的矩阵。(即种类相同的矩阵)
所以我们必须错位加上一个数,第一行加,第二行加,第三行加。
而且,对于,且为合数,我们是构造不出的。因为错位后我们第一次出现相同的位置是小于的。
所以,只有对于,且为质数,我们才能构造出方案,方案为:
而,且内最大的质数为,正好,故我们可以构造出方案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话