卡特兰数 pufer序列 bsgs

卡特兰数

卡特兰数

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440......

h(n)catalan数的第n

h(0)=1,h(1)=1

h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)(n2)

h(n)=h(n1)(4n2)/(n+1)

h(n)=C(2n,n)/(n+1).................(1)

h(n)=C(2n,n)C(2n,n1)..................(2)

用图比较好理解

卡特兰数有一个很重要的意义就是:
Cn表示所有在n×n格点中不越过对角线的单调路径的个数(只向上向右走)

image

image

不考虑不越过对角线这个条件,有C2nn种方案,对每个越过对角线的不合法方案,一定经过y=x+1这条直线,从路径与该直线的第一个交点处开始,剩余路径进行镜像处理(关于直线对称),终点一定是(n,n)关于直线的对称点(n1,n+1)每一条(0,0)>(n1,n+1)的路径,对应一条计数的非法路径,所以合法路径数为

C2nnc2nn1

得到公式(2),展开通分整理得到(1)

例题

网格

用类似卡特兰数证明得到答案为

Cn+mnCn+mn+1

展开整理

(n+m)!(nm+1)/(n+1)!m!

分解质因数约分,然后高精乘统计答案

有趣的数列

可以看成将长度为2n的排列分成两个排列,那么一共有C2nn

考虑条件3,偶数位里面一个偶数要比前面的偶数位大,而这些数位又比和他们对应的奇数位大,所以我们可以得到:

对于任意偶数位,这里放的数都大于前面的所有数

换句话说,就算前面所有位置都放尽可能小的数,这个位置最小也就只能放跟它下标一样大的数了(位置4只能放大于等于4的值)

我们转换一下题意,变成1~2n一次放入这个数列里,对于每次放的数要么放在最前的奇数位,要么放在最前的偶数位。

联系前面的结论,我们可以知道:一个数列如果有偶数个数多于奇数个数的情况,就不可能满足条件了

放一个偶数看作坐标系中向上走一步,放一个奇数看作向右,可以得到卡特兰数

树屋阶梯

大佬的题解

每次放的钢块一定有一个阶梯角,考虑阶梯角在哪里的钢块覆盖了(n,0),然后余下部分记录方案,可以得到卡特兰数,具体过程图解大佬的博客讲的很清楚,蒟蒻就不多说了

pufer序列

pufer序列与无根树存在对应关系

n个点的无根树得到的pufer序列长度为n2

如果令编号小的点优先,那么pufer序列与无根树唯一对应

由无根树得到pufer序列

  • 找到编号最小的叶节点,将他的父亲加入pufer序列,删除该节点

  • 重复操作至剩余两个节点

pufer序列转无根树

  • 取出prufer序列最前面的元素x

  • 取出在点集中的、且当前不在prufer序列中的最小元素y

  • 在x,y之间连接一条边

  • 最后在点集中剩下的两个点中连一条边

性质:

  1. pufer序列与无根树一一对应

  2. 度数为k的点在pufer序列中出现k-1次

  3. 一个n个点的完全图的生成树的个数为nn2

对于一个n个点的无根树,它的prufer序列长为n−2,而每个位置有n种可能性,因此可能的prufer序列有nn2种,prufer序列与无根树一一对应,因此生成树个数nn2

  1. 对于给定度数为d1n的一棵无根树共有(n2)!i=1n(di1)!种情况。

(1)由上面的性质可以知道,度数为di的节点会在prufer序列中出现di1

则就是要求出di1i(1in)的全排列个数。

而上面那个式子就是可重全排列公式。(即全排列个数除以重复元素内部的全排列个数)

(2)另一种理解方式

n2个位置,要放n个数,数i要占d[i]1个位置

这就变成了一个简单的组合数问题,ans=i=1nCd[i]1sum其中sum为剩余的位置数

树的计数

套用公式,注意

  1. 边乘边除/高精/组合数/python
  2. 判无解

明明的疑惑

我真是太疑惑了,高精乘进位写成+=调了半天没想到高精出锅了。。

sum=i=1nd[i]1(d[i]!=1)

cnt=i=1n(d[i]!=1)

如果d[i]==0或者sum>n2显然不合法,直接判无解

因为pufer序列与无根树一一对应,考虑能生成多少序列

有度的点在序列中占用了sum个位置,有Cn2sum种选法

又有每个点的度数要求,就是知道了每个点在序列中的出现次数,那么对这些点可能的排列有sum!Πi=1n(d[i]1)!(d[i]!=1)

序列剩下n2sum个位置,每个位置都是ncnt种选择有(ncnt)n2sum

最后的式子是
Cn2sumsum!Πi=1n(d[i]1)!(ncnt)n2sum(d[i]!=1)

展开化简得(n2)!Πi=1n(d[i]1)!(n2sum)!(ncnt)n2sum(d[i]!=1)

BSGS(基础)

大步小步算法,常用于解决离散对数问题

即求解axb(modp)(ap)其中方程的解满足0x<p

x=Ap B

其中A,B[0,p]

aApBb(modp)

变形

aApbaB(modp)

枚举B计算baB,用map/hash存一下

再枚举A计算aAphash/map查找对应值

解为x=Ap B

如果没有找到则无解

时间复杂度枚举A,B均为p所以总复杂度O(p)使用map会多一个log

随机数生成器

推式子

x2=(ax1+b)%p

x3=(ax2+b)%p=(a2x1+ab+b)%p

x4=(ax3+b)%p=(a3x1+a2b+ab+b)%p

xi=(axi1+b)%p=(ai1x1+bj=0i2aj)%p

S=j=0i2aj

aS=j=1i1aj

(a1)S=ai11

S=(ai11)/(a1)

xi=(ai1x1+b(ai11)/(a1))%p

问题转化为

判断

t(ai1x1+b(ai11)/(a1))(modp)

是否有解

移项整理,求一下逆元,然后就是裸的bsgs

注意在a=1时是个不定方程,扩欧解决,a=0直接特判

计算器

裸题

Discrete Logging

裸题

Matrix

同样的方法,写个矩阵哈希就行了,可以写两个防止挂掉

posted @   Chen_jr  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示