【20190705模拟赛】**题大杂烩

swords

容斥一下就好了,考虑把总方案减去不合法的方案

trominoes

杨表……(真实NOI模拟)

首先题意转化后,是在路廓线上进行填方块,并要求轮廓线时刻是凸的

然后用 $0$ 表示竖着的,$1$ 表示横着的,这样每条轮廓线就是一个长度为 $n+m$ 的 $01$ 串了

初始状态是 $000000011111111$

考虑手玩一下每次的转移,实际上是扩充了一个凸的轮廓线,于是就是把某个位置的 $1$ 往左挪了三个位置(需要保证那个位置上不能是 $1$(

然后就可以在模 $3$ 意义下分别做一遍,然后把它们拼起来了

然后就成了给定一个 $01$ 序列,每次可以把一个 $1$ 往左挪一格,求方案数

再把它还原回轮廓线的模型,也就是给定一个 $n \times m$ 的网格,求有多少个每行每列都是递增的填法(把 $1 \sim nm$ 填进去)

根据钩子定理,可以得知它的方案数为:

$$
\frac{(nm)!}{\prod_{i=1}^{n}\prod_{j=1}^{m}(n-i+m-j+1)}
$$

然后就做完了啊……记得要乘上把三个部分拼起来的方案数……

islands

求 $n$ 个点构成的所有有根树森林中,恰好有 $m$ 棵树,且根的度数不超过 $k$

首先选出树根,它是 ${n \choose m}$

然后对于剩下的 $n-m$ 个点,求把它们拼成森林的方案数

设 $n$ 个点,拼成 $m$ 棵树的森林的方案数为 $f(n,m)$

设 $n$ 个小球,放到 $m$ 个箱子,且每个箱子最多有 $k$ 个球的方案数为 $g(n,m)$

则答案为:

$$
{n \choose m} \sum_{i=0}^{mk} f(n-m,i) \cdot g(i,m)
$$

---

先看 $f$,不妨枚举一个划分,剩下的就是无向图生成树计数

也就是:

$$
f(n,m)=\sum_{i=1}^{n} {n \choose i} f(n-i,m-1) i^{i-2}
$$

考虑转化:添加一个超级根连向这些点

那么就要求这个超级根出现了 $m$ 次,即:

$$
\begin{aligned}
f(n,m)={n+1-2 \choose m-1} n^{n+1-2-(m-1)}={n-1 \choose m-1}n^{n-m}
\end{aligned}
$$

---

然后看 $g$,看起来只能递推:

$$
g(n,m)=\sum_{i=0}^{k} {n \choose i} g(n-i,m-1)
$$

一开始有:

$g(n,1)=[n \le k]$

---

整理一下:

目标:

$$
{n \choose m} \sum_{i=0}^{mk} f(n-m,i) \cdot g(i,m)
$$

其中:

$$
f(n,m)={n-1 \choose m-1}n^{n-m}
$$

同时:

$$
g(n,m)=\sum_{i=0}^{k} {n \choose i} g(n-i,m-1)
$$

然而这个 $g$ 还可以优化,考虑容斥(大概没写错):

$$
g(n,m)=m\cdot g(n-1,m)- m \cdot g(n-(k+1),m-1) \cdot {n-1 \choose k}
$$

传统艺能:任意模数组合数

考虑维护组合数 $r\prod p_i^{k_i}$,每次除以一个数和乘以一个数,可以快速维护,其中 $r$ 需要扩展欧几里得算法来求逆元维护

posted @ 2019-07-05 12:16 KingSann 阅读(...) 评论(...) 编辑 收藏