AtCoder Regular Contest 140 D,E

D
不难发现最终的图将是若干个基环树。

先将我们已经知道的边连上。那么有些联通块已经成为基环树了,这样我们直接将答案+1,在下面填数时就不考虑它们了。

否则剩下的连通块一定都是树(单个点也算树),并且每个树中恰好有一个点没有连上(即每个树中都存在且仅存在一个点i,使得Ai=1)。

假设共有C个树,给它们依次标号1,2,...,C,其大小分别是siz(1),siz(2),...siz(C)

如果我们选择将编号为x1,x2,...,xp合并成一个联通块(通过将Ai=1的替换成正整数),那么方案数有(p1)!×i=1psiz(xi)种。

我们分开计算——即计算连通块大小为Q的共有多少种方案。

那么此时我们可以设dpi,j为考虑前i个,并且连通块已经包含了j个树的方案数。

答案就是i=1CdpC,i

时间复杂度为O(n2)

E
open problem?

首先如果500×500的我们构造出来了,那么所有的都可以解决(取左上角为1,1,右下角为n,m的子矩阵)。


我们考虑x×x的情况。可以发现对[1,2,...,x]数组重复x次,每次将第一个放到最后一个。比如x=3时,它长成这个样子:

 1 2 3
 2 3 1
 3 1 2

这样,所有的x×x的矩阵我们就可以有解。但注意的是,由于我们数字最大取到25,所以这个做法仅对n,m25的有用。

其实,我们还有别的x=3的矩阵,就是对行进行轮换。

 2 3 1
 3 1 2
 1 2 3
 3 1 2
 1 2 3
 2 3 1

所以,对于x×x的矩阵,我们有x种不同的。

此时我们有一个思路——将很多属于这x种的矩阵拼接一下,拼成一个更大的矩阵。

并且由于x2最大可以取到625,所以我们考虑利用x时的x中矩阵构造(x2)×(x2)时的答案。

比如对于9×9的矩阵,我们可以按照下面的方法拼接:

 1 1 1
 1 2 3
 1 3 2

其中1,2,3代表x=33种矩阵的编号。(就是上面列的)

但注意,形如:

a...a
.   .
a...a

是不能出现在矩阵中的,相同的,

a...a
.   .
b...b

a...b
.   .
a...b

也不能出现在矩阵中,比如:

 1 1
 2 2

对应的6×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×9的方案:

 1 1 1
 1 2 3
 1 3 2

它其实有规律:
第一行arrayi,j=(arrayi,j1+0)mod3+1
第二行arrayi,j=(arrayi,j1+1)mod3+1
第三行arrayi,j=(arrayi,j1+2)mod3+1
原因也很简单:我们之前分析中说,除了第一行和第一列,不能出现两个相同行或列上有轮换次数相同的矩阵。(即种类相同的矩阵)
所以我们必须错位加上一个数,第一行加0,第二行加1,第三行加2
而且,对于(x2)×(x2),且x为合数,我们是构造不出的。因为错位后我们第一次出现相同的位置是小于x2的。

所以,只有对于(x2)×(x2),且x为质数,我们才能构造出方案,方案为:

arrayi,j=(arrayi,j1+i1)modx+1

x25,且25内最大的质数为23,正好232=529>500,故我们可以构造出方案。

posted @   Nastia  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示