jzoj5988. 【WC2019模拟2019.1.4】珂学计树题 (burnside引理)
题面
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;
}
jzoj5988. 【WC2019模拟2019.1.4】珂学计树题 (burnside引理)的更多相关文章
- JZOJ 5988 珂学计树题 (Burnside引理)
什么神题a-没学过Burnside引理a学了也做不来系列-考场没怎么看这题,上最后十分钟打了样例就溜了-然后这题爆0了. Here CODE #include <cctype> #incl ...
- JZOJ5988 珂学计树题
题意 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_rund ...
- jzoj5987. 【WC2019模拟2019.1.4】仙人掌毒题 (树链剖分+概率期望+容斥)
题面 题解 又一道全场切的题目我连题目都没看懂--细节真多-- 先考虑怎么维护仙人掌.在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...
- jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
传送门 题面 题解 不难看出每个点的大小为行列限制中较小的那一个(因为数据保证有解) 对于行的每个限制,能取到的个数是列里限制大于等于它的数的个数,同理,对于列是行里大于它的个数(这里没有等于,为了避 ...
- 6359. 【NOIP2019模拟2019.9.15】小ω的树(tree)(定期重构)
题目描述 题解 qy的毒瘤题 CSP搞这种码农题当场手撕出题人 先按照边权从大到小建重构树,然后40%暴力修改+查找即可 100%可以定期重构+平衡规划,每次把B个询问拉出来建虚树,在虚树上暴力维护每 ...
- [JZOJ6359] 【NOIP2019模拟2019.9.15】小ω的树
题目 题目大意 给你一棵树,带点权和边权. 要你选择一个联通子图,使得点权和乘最小边权最大. 支持修改点权操作. 思考历程 显然,最先想到的当然是重构树了-- 重构树就是在做最大生成树的时候,当两个联 ...
- CF896C Willem, Chtholly and Seniorious(珂朵莉树)
中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 「学习笔记」珂朵莉树 ODT
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...
随机推荐
- Darwin Streaming Server性能测试报告
为了验证Darwin Streaming Server在流媒体点播上的性能,EasyDarwin开源项目官方特地与国内某大型视频网站进行了一次性能测试(千兆网络环境下),针对本次RTSP直播流媒体测试 ...
- java四种线程池简介,使用
为什么使用线程池 1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务. 2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止消耗过多的内存 3.web项目应该创建统 ...
- 九度OJ 1109:连通图 (最小生成树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2783 解决:1432 题目描述: 给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的. 输入: 每组数据的第一行是两个整数 n ...
- 7.JavaScript变量
VAR声明变量,一条语句可以声明多个变量 var name="Gates", age=56, job="CEO"; Value = undefined 在计算机 ...
- 谷歌浏览器使用SelectorGadget和Xpath Helper获取xpath和css path
在上篇文章里,介绍了如何在火狐浏览器中获取网页元素的xpath和css path. 这篇文章将介绍,在谷歌浏览器中使用SelectorGadget和Xpath Helper实现同样功能. 这两个谷歌浏 ...
- Xcode使用的一些小技巧,值得一看。
有时我们需要对一个已有项目进行重构,改进设计,提高代码质量.以下几个Xcode 4中的功能,会使重构的工作变得轻松很多. 1.打开项目我的项目是Xcode3.x中编辑的,在用Xcode 4 打开时出现 ...
- jstat监控gc情况
jstat监控gc情况 JavaJVMJ2SE应用服务器SUN 性能测试过程中,我们该如何监控java虚拟机内存的使用情况,用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的t ...
- (深入理解计算机系统)AT&T汇编指令
AT&T汇编指令学习(GCC) 寄存器命名原则: 相比inter语法,AT&T语法格式要求所有的寄存器都必须加上取值符"%". 操作码命令格式: 源/目的操作数顺序 ...
- dhclient命令
语法:dhclient(选项)(参数) 选项0:指定dhcp客户但监听的端口号-d:总是以前台方式运行程序-q:安静模式,不打印任何错误的提示信息-r:释放ip地址 参数:网络接口:操作的网络接口 示 ...
- BZOJ_2850_巧克力王国_KDTree
BZOJ_2850_巧克力王国_KDTree Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力.对于每一块 ...