zoukankan      html  css  js  c++  java
  • [校内训练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/

  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/14477001.html
Copyright © 2011-2022 走看看