2022.1.20 模拟赛
题出的还不错,可惜我太菜了。
T1 刀剑传奇 (swords)
FWT 变换后在点值表示上选 \(k\) 个,再变换回去。也可以理解为高维前缀和 + 容斥。
T2 三格骨牌 (trominoes)
好家伙第一次见杨表题。
容易发现只能填入 ▛
▟
▎
▂
,求保持阶梯状并且填满的操作过程方案数。
关注轮廓线,用 1
表示竖线、0
表示横线,也就是通过
1100 -> 0101
1010 -> 0011
1110 -> 0111
1000 -> 0001
四种操作,将 \(n\) 个 1
、\(m\) 个 0
变化为 \(m\) 个 0
、\(n\) 个 1
。
发现中间两位不变,\(1,4\) 两位由 10
变为 01
。
所以下标按 \(\bmod 3\) 意义分类,分别计算方案数,然后重标号操作序列。
现在转化为 01
序列每次交换相邻的 1
和 0
,也就是 \(x\times y\) 的网格图保持阶梯状轮廓线进行填数,也就是 \(x\times y\) 的杨图填数方案数。套用勾长公式,答案为
实现时需要枚举 \(i+j\) 计算来降低复杂度。
T3 为了部落 (islands)
题意:\(n\) 个有标号点划分成 \(m\) 个有根树,要求每个根的度数不超过 \(k\) 的方案数。模数不为质数。
先枚举 \(m\) 个根。\(m,k\) 相对较小,考虑枚举 \(m\) 个根相邻点的数量。
DP \(f(i,j)\) 表示 \(j\) 个有标号球划分 \(i\) 个有标号盒子,且每个盒子不超过 \(k\) 个的方案数。转移可以容斥
复杂度 \(\mathcal O(mk^2)\)。
假设有 \(r\) 个点与这些根相邻,\(n-m\) 点要划分成 \(r\) 棵树的森林,就可以用 prufer 序列计数。
扩展 Cayley 公式:
\(N\) 个点 \(M\) 棵树,并且点 \(1\dots M\) 属于不同的树,方案数为
\[MN^{N-M-1} \]也就是填入长为 \(N-M\) 的 prufer 序列,最后一个被填入的数必须是 \(1\dots M\)。
答案也就是
还有一种方法:用虚点把这 \(r\) 个点连起来就是一棵树了,强制虚点度数为 \(r\),也就是 prufer 序列里恰好 \(r-1\) 个位置填虚点,推出来是一样的。
模数不为质数,但是需要求上指标很大的组合数。可以将模数分解质因数,对于所有数,包含的这些特殊质因数记录次幂,剩余部分和模数互质可以正常计算。