Loading

【题解】雅礼集训 2018 Day1 题解

计数专场?

「雅礼集训 2018 Day1」树

考虑令 \(f_{i,j}\) 表示大小为 \(i\) 的树,深度为 \(j\) 的方案数。

一般的 DP 合并过程:枚举大小为 \(a,b\) 的树,然后把 \(b\) 的根接到 \(a\) 的根下面。但是这样会算重:打个比方,以 \(1\) 为根,儿子为 \(2,3\) 的树会被算两次。

不过可以发现,原树的任意一颗子树中,编号最小的点一定为根,编号次小的一定与根相连。这样只需要接入 \(b\) 的时候钦定 \(b\) 的根是编号次小的点即可。

不取模的答案本地用 __int128_t 或者 double 打表即可。

已经实现:提交记录


「雅礼集训 2018 Day1」仙人掌

考虑一个简单的 DP:令 \(f_{i,0/1}\) 表示点 \(i\) 是否被父亲的边指向时的子树方案数。这个 DP 可以用分治 NTT 优化。

现在考虑环上的情况,令 \(g_{i,0/1,0/1}\) 表示环上第 \(i\) 个点,上一个点到其是入边 / 出边,其到下一个点是入边 / 出边时前 \(i\) 个点的方案数。只需要对子树的 \(f\) 做了前缀和就可以快速转移。

最后合并给环中最上面的点即可,用分治 NTT 加速。

已经实现:提交记录

被新码风整吐了。


「雅礼集训 2018 Day1」图

以路径长度为奇数为例。

考虑前 \(i\) 个点中,有 \(w_0\) 个奇数白点,\(w_1\) 偶数白点,\(b_0\) 个奇数黑点,\(b_1\) 个偶数黑点:

  • 如果当前点为白点:

    • 路径为奇数:

      \[2^{w_0+w_1}\sum_{i=0}^{b_0}[2\mid i]\sum_{j=0}^{b_1}{b_0\choose i}{b_1\choose j}=2^{w_0+w_1+b_0+b_1-1} \]

    • 路径为偶数:情况类似。

  • 如果当前点为黑点:情况类似。

这样子的话可以发现,奇数路径和偶数路径的数量是相等的,正因为如此,就没必要将奇数和偶数分别记录了。接着考虑黑白点个数。容易发现上述转移式跟黑白点个数并没有关系。

最后需要注意,奇偶路径数相等,即组合数下标按照奇偶分类后和相等,对 \({n\choose m}\)\(n=0\) 的情况是不成立的,在这种情况下只能从偶数转移到奇数,需要单独讨论。

判断 \(n=0\) 的情况只需要记录是否存在相应节点即可,注意路径数奇偶性还需要再开一维。时间复杂度 \(O(n)\)

已经实现:提交记录

posted @ 2021-03-01 20:35  Moonlightsqwq  阅读(176)  评论(0编辑  收藏  举报