数论笔记—卡特兰数、扩展欧几里得
数论笔记—卡特兰数、扩展欧几里得
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\)互质
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号