数论笔记—卡特兰数、扩展欧几里得
数论笔记—卡特兰数、扩展欧几里得
1.卡特兰数
题目
给定 n 个 0 和 n 个 1,它们将按照某种顺序排成长度为 2n 的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。
答案即卡特兰数,预处理累乘数之后,计算组合数,使用快速幂求逆元(费马小定理)
卡特兰数=
下述问题的答案也是卡特兰数
(1)n个结点的二叉树数量h(n) ;
(2)矩阵链乘:,有多少种不同的计算次序?(相当于加括号,问合法括号序列有多少个)
(3)一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
(4)有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
内容来自参考题解
2.扩展欧几里得定理
作用
用于求逆元,费马小定理不适用于非质数的情况
求解线性同余方程
裴蜀定理
对于不全为0的整数,则一定存在整数,使得;
模板
int exgcd(int a, int b, int &x, int &y){
if(!b){
x = 1; y = 0;
return a;
}
int d=exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
线性同余方程 可以转化为
当时有解
答案为
乘法逆元
求解线性同余方程 ,即可求得的乘法逆元
//用于求解模数非质数时的乘法逆元, 需要满足与互质
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步