传送门

题面

liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_runda想让选手数n个节点的不同构的二叉树的数目.
但是liu_runda虽然退役已久,也知道答案就是Catalan(n),这太裸了,出出来一定会被挂起来裱.因此他把题目加强.我们从二叉树的根节点出发一直向右儿子走到不能再走为止,可以找到最右下方的节点v,这个节点是没有右儿子的.
如果根节点和v不相同,我们就把根节点和根节点的右儿子断开,让根节点的右儿子成为新的根节点,同时把根节点接在v的右儿子位置.根节点的左儿子此时仍然挂在根节点上.
这样的操作可以进行多次.如果两棵二叉树能通过若干次这样的操作变得同构,我们也认为它们是同构的.
问在这种新的定义下有多少n个节点的本质不同的二叉树.答案可能很大,所以只需要输出对998244353取模后的结果.

题解

全场切就我一个不会的……话说我对\(burnside\)理解还是太浅啊……

我们对于一棵二叉树定义一个括号表示法,其中第一个左括号和第一个右括号之间的是根节点的左子树,后面的全都是根节点的右子树。如果某一对匹配的括号满足不存在其他匹配的括号包含它们,我们就称其为“顶级括号”。

从二叉树的根节点出发向右儿子方向一直走到没有右儿子时,经过的一条链我们不妨称作“右侧链”。根据刚刚的定义,每个顶级括号都对应右侧链上的一个节点。而每个顶级括号内部的串对应这个节点的左子树。

这样的话\(n\)个节点的二叉树就可以用\(n\)个左括号和\(n\)个右括号组成的合法的括号序列来表示了,可以转化为数“循环移位后相同则本质相同”的括号序列个数

这里有个小问题,比如\((())\)移位后变成\()(()\),后者不合法,说明这个交换群不满足封闭性

于是这里有个结论:\(n\)个\(0\),\(n\)个\(1\)的\(01\)序列“循环移位后相同则本质相同”的等价类个数和\(n\)对合法括号序列的等价类一一对应

显然每个合法的括号序列都可以转化为\(01\)序列。而对于每个\(01\)序列,都可以经过若干次循环移位后得到一个“任意前缀中\(0\)的个数不少于\(1\)”的序列,就可以把它转化为一个合法的括号序列

所以现在只要数\(01\)序列的不同等价类个数就好了。根据\(burnside\)引理,等价类个数为不动点总数的平均值。

往右旋转\(0\)次不变,每个点都不变,不动点个数为\({2n\choose n}\)

往右旋转\(1\)次不变,需要任意两个相邻位置颜色相等,不存在

往右旋转\(2\)次不变,那么奇数位置都相同,偶数位置都相同,有2种

往右旋转\(m\)次不变,那么记\(G=\gcd(2n,m),G,2G,3G…\)这些位置都相同,\(1,G+1,2G+1…\)这些位置都相同,因此我们只需要考虑前\(G\)个位置如何排列。只有当\(G\)为偶数的时候有\({G\choose G/2}\)个不动点

于是就可以做到\(O(n\log n)\)计算了,其中\(\log\)是计算\(\gcd\)的复杂度(也可以直接\(O(n)\)预处理欧拉函数然后搞,不过懒了2333)

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=2e6+5,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
int fac[N],inv[N],n,res,lim,g;
inline int C(R int n,R int m){if(m>n)return 0;return 1ll*fac[n]*inv[m]%P*inv[n-m]%P;}
inline int gcd(R int x,R int y){if(!y)return x;while(y^=x^=y^=x%=y);return x;}
int main(){freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);scanf("%d",&n),lim=n<<1;fac[0]=inv[0]=1;fp(i,1,lim)fac[i]=mul(fac[i-1],i);inv[lim]=ksm(fac[lim],P-2);fd(i,lim-1,1)inv[i]=mul(inv[i+1],i+1);for(R int i=0;i<=lim-1;i+=2)g=gcd(lim,i),res=add(res,C(g,g/2));printf("%d\n",mul(res,ksm(lim,P-2)));return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10223284.html

jzoj5988. 【WC2019模拟2019.1.4】珂学计树题 (burnside引理)相关推荐

  1. JZOJ 5988 珂学计树题 (Burnside引理)

    什么神题a-没学过Burnside引理a学了也做不来系列-考场没怎么看这题,上最后十分钟打了样例就溜了-然后这题爆0了. Here CODE #include <cctype> #incl ...

  2. JZOJ 5988. 【WC2019模拟2019.1.4】珂学计树题

    Description liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开 ...

  3. [JZOJ5988]【WC2019模拟2019.1.4】珂学计树题【Burnside引理】【排列组合】【括号序】

    Description 从一棵二叉树的根节点出发一直向右儿子走到不能再走为止,可以找到最右下方的节点v,这个节点是没有右儿子的. 如果根节点和v不相同,我们就把根节点和根节点的右儿子断开,让根节点的右 ...

  4. JZOJ 5988 珂学计树题 【树-括号序列-01序列+Burnside引理】

    题面: 题目分析: 朴素的想法是枚举右链的长度,但这样做的复杂度是O(n3)O(n^3)O(n3)级别的(考虑卷积是O(n2logn)O(n^2logn)O(n2logn)的). 把树转成括号表示: ...

  5. JZOJ 5987. 【WC2019模拟2019.1.4】仙人掌毒题

    Description Input 输入文件cactus .in 第一行4个空格隔开的整数n,m,t,w 接下来m行,每行两个空格隔开的整数u,v,表示m次加边操作. Output 输出文件为cact ...

  6. jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)

    传送门 题面 题解 不难看出每个点的大小为行列限制中较小的那一个(因为数据保证有解) 对于行的每个限制,能取到的个数是列里限制大于等于它的数的个数,同理,对于列是行里大于它的个数(这里没有等于,为了避 ...

  7. JZOJ5996. 【WC2019模拟2019.1.12】回文后缀

    题解 直接设答案fif_ifi​表示用字符集s构成长度为i的串,且不存在长度大于1的回文后缀. 相对的,设gig_igi​表示用字符集s构成长度为i的串,且存在长度大于1的回文后缀. 那么fi+gi= ...

  8. jzoj6342-[NOIP2019模拟2019.9.7]Tiny Counting【树状数组,容斥】

    正题 题目大意 一个序列SSS,求有多少个互不相同的4元组(a,b,c,d)(a,b,c,d)(a,b,c,d)使得a<b且Sa<Sba<b且S_a<S_ba<b且Sa​ ...

  9. jzoj6191-[NOI2019模拟2019.5.31]Exchange【线段树】

    正题 题目大意 一个序列,给定若干个区间[l..r][l..r][l..r] 从l∼rl\sim rl∼r任意一个位置出发,见到比手中大的数字就交换,到rrr求最小的交换次数 (注意,并不是真的交换) ...

最新文章

  1. 深度强化学习的前景:帮助机器掌控复杂性
  2. 换血吃药改基因,硅谷富豪们想用钱收买死神丨视频
  3. 看到了商机,为什么赚不到钱?
  4. Linux下几款C++程序中的内存泄露检查工具
  5. kali字典_kali黑客系统wpscan工具扫描wordpress漏洞入侵攻击测试教程
  6. 4修改初始值_Java基础语法 --4(连载)
  7. Android 常用的数据加密方式
  8. jQuery - 链(Chaining)
  9. 分布式锁的几种实现方式~
  10. AntiXSS v4.0中Sanitizer.GetSafeHtmlFragment等方法将部分汉字编码为乱码的解决方案
  11. 《如何搭建小微企业风控模型》第八节 反欺诈策略 节选
  12. Anaconda下改变python的版本
  13. 零基础学python pdf-Python pdf(零基础入门学习Python)V1.0 最新版
  14. 重点| 系统集成项目管理工程师考前50个知识点
  15. 【搬运及个人处理】联想电脑(Lenovo XiaoXinAir-14IIL 2020)散热模式Fn+Q 失效解决方案
  16. bash中的字符串长度
  17. VOIP+PSTN集成方案
  18. 股价翻番 人生赢家,python爬取基金 筛选股票
  19. ftp服务器匿名用户文件夹,ftp服务器匿名用户文件夹
  20. 树莓派科学小实验4B--07_继电器

热门文章

  1. 使用fastboot命令刷机流程详解
  2. MySQL 10061
  3. 应用COMSOL Multiphysics分析多分支缝初始裂缝起裂点
  4. 计算机网络阻塞和死锁,高并发和死锁
  5. 数据质量管理:拒绝鸡肋
  6. 使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行
  7. 10个针对设计师/开发者的实用CSS工具推荐 转
  8. php版本有什么不同,浅谈PHP几个版本的区别
  9. Android 给大家介绍几种避免手机报毒导致客户流失的问题的方法
  10. 什么是SCI期刊分区,让你一次搞懂!