• [校内训练2021_03_03]C


    题目大意:问平面上有多少个不同的由n个点组成的无向无标号的树(即在纸上画树,树边不能交叉)。n=10000000,对质数取模。

    思考:

    由于树太难直接考虑,我们需要建立一种一一对应的关系来方便计数。这里将树变成了平面图,即对于任意一个有2(n-1)个点均匀分布在圆周上的圆,我们给这些点两两配对,连出n-1条严格不相交的弦,那么这个圆和n-1条弦构成的平面图的对偶图就唯一确定了一棵树;而对于一棵树,也能唯一确定它的一个平面图。因此这个对应是等价的。

    考虑如何对有2n个点的圆(注意这里的n并不是树的点数,只是为了方便讨论而写的)进行计数。根据burnside引理,一个置换群的染色方案数等于不动点的平均值,因此我们枚举圆旋转了$frac{2*pi}{2*n}*k$弧度。不难发现,对于n为偶数的情况,所有奇数的k都没有任何方案(因为一条边只转一格必然与自己相交);对于n为奇数的情况,若k为奇数,那么只有k=n才有贡献,即必然存在一条过圆心的直径,直径左右两边的连边方式互相对称,因此贡献为$n*Cat(frac{n-1}{2})$,其中$Cat$为卡特兰数。

    接下来我们只考虑$2k<2n$,即转动偶数格的情况。令$d=gcd(2n,2k)$,易发现d的含义是某一个点在圆上旋转,会经过$frac{2n}{d}$个不同的点,这样共形成了d个组。而我们要做的,就是在这d个组之间“循环”地连边,使得边两两不相交。而这部分的答案为$ binom{d}{d/2}$。这也就是说,我们指定任意一个组内的连出去的点和连进来的点,一定存在一种唯一的方案是合法的。

    考虑方案的唯一性:如果我们指定连边的方向,那么连边过程相当于括号匹配,因此如果我们从某个地方断开,将前面的括号部分拼接到后面,括号匹配的方法必然是唯一的。

    考虑方案的存在性:我们要从某个地方断开,将前面的括号拼接到后面,使得开始往后的前缀和大于等于0(左括号为+1,右括号为-1)。其实我们只要先任意地找一个断开的位置,找到前缀和最小的地方,再从那个地方断开即可。如果这样仍不能满足前缀和大于等于0,那么之前断开的地方一定不是最小值。

    最后是不动的置换,显然是$Cat(n)$。

    线性筛预处理,即可做到线性。

    代码:见https://wallbreaker5th.github.io/2020/%E6%9F%90SCOI%E6%A8%A1%E6%8B%9F%E8%B5%9B%20T3%20%E7%94%BB%E5%9B%BE%EF%BC%88draw%EF%BC%89%EF%BC%88%E6%97%A0%E6%A0%B9%E6%97%A0%E6%A0%87%E5%8F%B7%E5%B9%B3%E9%9D%A2%E6%A0%91%E8%AE%A1%E6%95%B0%EF%BC%89/

  • 相关阅读:
    189. go学习1
    [Access][Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度 Invalid string or buffer length
    聊聊我对 GraphQL 的一些认知
    gin 源码阅读(2)
    gin 源码阅读(1)
    自动化测试感悟——感悟10条
    Python转exe神器pyinstaller
    在用Python时遇到的坑
    Python BeautifulSoup库 常用方法
    DCDC反馈电路串联的电阻
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/14477001.html
Copyright © 2020-2023  润新知