数论笔记—卡特兰数、扩展欧几里得

数论笔记—卡特兰数、扩展欧几里得

1.卡特兰数

题目

给定 n 个 0 和 n 个 1,它们将按照某种顺序排成长度为 2n 的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。

题目链接

答案即卡特兰数,预处理累乘数之后,计算组合数,使用快速幂求逆元(费马小定理)

卡特兰数=$ \frac{C_{2n}^n}{n+1}\ $

下述问题的答案也是卡特兰数

(1)n个结点的二叉树数量h(n) ;

(2)矩阵链乘:$ P=A1×A2×…×An$,有多少种不同的计算次序?(相当于加括号,问合法括号序列有多少个)

(3)一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?

(4)有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

内容来自参考题解

2.扩展欧几里得定理

作用

用于求逆元,费马小定理不适用于非质数的情况

求解线性同余方程 \(A_i*x \equiv B_i(mod\ m_i)\)

裴蜀定理

对于不全为0的整数\(a,b\),则一定存在整数\(x,y\),使得\(ax+by=gcd(a,b)\);

\(exgcd\)模板

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;
}

线性同余方程 \(A_i*x \equiv B_i(mod\ m_i)\) 可以转化为 \(A_i\ *\ x+m_i\ *\ y = \ B_i\)

\(gcd(A_i,m_i)\%d\ ==0\)时有解

答案为 $ x*d/b%m$

乘法逆元

求解线性同余方程 \(A_i*x \equiv 1(mod\ m_i)\) ,即可求得\(A_i\)的乘法逆元

//用于求解模数非质数时的乘法逆元, 需要满足\(Ai\)\(mi\)互质

posted @ 2022-07-14 21:34  通宵  阅读(76)  评论(1)    收藏  举报