基本计数原理
加法原理
解决一件事情,有k类方法,第i类方法有a[i]种选择。那么总方案数=a[1]+a[2]+....+a[k]
乘法原理
解决一件事情,有k个步骤,第i个步骤有a[i]种选择。那么总方案数=a[1] * a[2]....* a[k]
排列组合
排列:
将n个元素选取k个出来构成一个排列,总方案数$A_{n}^{k} $= \(\frac{n!}{(n-k)!}\)
组合:
将n个元素选取k个出来构成一个集合总方案数$C_{n}^{k} $= \(\frac{A_{n}^{k}}{k!}\)= \(\frac{n!}{(n-k)!k!}\)
多重集的排列与组合数
多重集的排列是指有k种元素,第i种元素的个数为a[i],总元素个数为n,其全排列的方案数为:
多重集的组合数1:
设有k种元素,第i种元素的个数为a[i],取共计r个元素构成集合且r<=a[i],其组合数:
证明:
考虑隔板法,因为每种元素都可以不选,考虑先给每种元素都选一个,那么也就是选r+k个,隔板法r+k-1个空隙,放k-1个隔板,那么每份隔出的数量-1对应选择该种元素的个数。因为r<=a[i],所以无论隔出的情况如何都不存在出现一种元素选取个数大于其总个数的情况
组合数的常用性质
性质1:
性质2:
性质3:
从动态规划的想法出发很好理解:
\(C_{m-1}^{n-1}\)其实就是第n个数选了,而\(C_{m}^{n-1}\)则是没选
写代码的话初始状态设\(dp[0][0]=1\)
从另一种角度看,它就是杨辉三角

这里不得不提一个很重要的东西:二项式定理
二项式定理
所以杨辉三角的元素其实就是二项式定理展开后的系数
这里写一个最简单的证法:
可以把\((a+b)^n\)看作\((a+b)(a+b)...(a+b)\),你会发现每一项都只能选a或b,\(a^ib^{n-i}\)的系数就是n个里面选i个a和n-i个b,也就是\(C_{n}^{i}\)
组合数的计算方法
方法1:
利用杨辉三角进行计算,时间复杂度O(n * m)
方法2:
利用定义式计算,要将除以阶乘的部分用乘法逆元处理,时间复杂度O(n)
ps:该方法要求k!和(n-k)!均与模数p互质
乘法逆元
定义:对于正整数a,p,若a与p互质,那么\(a* x\equiv 1(\bmod p)\)时,称a和x在模p意义下互为乘法逆元,记为inv[a]=x
由此可得\(\frac{a}{t} \bmod p = a\times inv[t]%p\)
而求乘法逆元可以用费马小定理
费马小定理
对于正整数a,p,p为质数,且a与p互质,那么\(a^{p-1}\equiv 1(\bmod p)\)
于是一凑:\(a* a^{p-2}\equiv 1(\bmod p)\),得出a和\(a^{p-2}\)在模p意义下互为乘法逆元

浙公网安备 33010602011771号