卡特兰数 pufer序列 bsgs
卡特兰数
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440......
设为数的第项
,
.................(1)
..................(2)
用图比较好理解
卡特兰数有一个很重要的意义就是:
表示所有在格点中不越过对角线的单调路径的个数(只向上向右走)
不考虑不越过对角线这个条件,有种方案,对每个越过对角线的不合法方案,一定经过这条直线,从路径与该直线的第一个交点处开始,剩余路径进行镜像处理(关于直线对称),终点一定是关于直线的对称点每一条的路径,对应一条计数的非法路径,所以合法路径数为
得到公式,展开通分整理得到
例题
网格
用类似卡特兰数证明得到答案为
展开整理
分解质因数约分,然后高精乘统计答案
有趣的数列
可以看成将长度为的排列分成两个排列,那么一共有种
考虑条件3,偶数位里面一个偶数要比前面的偶数位大,而这些数位又比和他们对应的奇数位大,所以我们可以得到:
对于任意偶数位,这里放的数都大于前面的所有数
换句话说,就算前面所有位置都放尽可能小的数,这个位置最小也就只能放跟它下标一样大的数了(位置4只能放大于等于4的值)
我们转换一下题意,变成1~2n一次放入这个数列里,对于每次放的数要么放在最前的奇数位,要么放在最前的偶数位。
联系前面的结论,我们可以知道:一个数列如果有偶数个数多于奇数个数的情况,就不可能满足条件了
放一个偶数看作坐标系中向上走一步,放一个奇数看作向右,可以得到卡特兰数
树屋阶梯
每次放的钢块一定有一个阶梯角,考虑阶梯角在哪里的钢块覆盖了,然后余下部分记录方案,可以得到卡特兰数,具体过程图解大佬的博客讲的很清楚,蒟蒻就不多说了
pufer序列
pufer序列与无根树存在对应关系
个点的无根树得到的pufer序列长度为
如果令编号小的点优先,那么pufer序列与无根树唯一对应
由无根树得到pufer序列
-
找到编号最小的叶节点,将他的父亲加入pufer序列,删除该节点
-
重复操作至剩余两个节点
pufer序列转无根树
-
取出prufer序列最前面的元素x
-
取出在点集中的、且当前不在prufer序列中的最小元素y
-
在x,y之间连接一条边
-
最后在点集中剩下的两个点中连一条边
性质:
-
pufer序列与无根树一一对应
-
度数为k的点在pufer序列中出现k-1次
-
一个n个点的完全图的生成树的个数为
对于一个n个点的无根树,它的prufer序列长为n−2,而每个位置有n种可能性,因此可能的prufer序列有种,prufer序列与无根树一一对应,因此生成树个数
- 对于给定度数为的一棵无根树共有种情况。
由上面的性质可以知道,度数为的节点会在序列中出现次
则就是要求出个的全排列个数。
而上面那个式子就是可重全排列公式。(即全排列个数除以重复元素内部的全排列个数)
(2)另一种理解方式
有个位置,要放个数,数要占个位置
这就变成了一个简单的组合数问题,其中sum为剩余的位置数
树的计数
套用公式,注意
- 边乘边除/高精/组合数/
python - 判无解
明明的疑惑
我真是太疑惑了,高精乘进位写成调了半天没想到高精出锅了。。
设
如果或者显然不合法,直接判无解
因为序列与无根树一一对应,考虑能生成多少序列
有度的点在序列中占用了个位置,有种选法
又有每个点的度数要求,就是知道了每个点在序列中的出现次数,那么对这些点可能的排列有
序列剩下个位置,每个位置都是种选择有种
最后的式子是
展开化简得
BSGS(基础)
大步小步算法,常用于解决离散对数问题
即求解其中方程的解满足
设
其中
有
变形
枚举计算,用存一下
再枚举计算在查找对应值
解为
如果没有找到则无解
时间复杂度枚举均为所以总复杂度使用会多一个
随机数生成器
推式子
设
问题转化为
判断
是否有解
移项整理,求一下逆元,然后就是裸的
注意在时是个不定方程,扩欧解决,直接特判
计算器
裸题
Discrete Logging
裸题
Matrix
同样的方法,写个矩阵哈希就行了,可以写两个防止挂掉
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】