算法专题
加法原理
若完成一件事的方法有 n n n类,其中第 i i i类方法包括 a i a_i ai种不同的方法,且这些方法互不重合,则完成这件事情共有 ∑ a i \sum a_i ∑ai种方法。
乘法原理
若完成一件事需要 n n n个步骤,其中第 i i i个步骤有 a i a_i ai种不同方法,且这些步骤互不干扰,则完成这件事共有 ∏ a i \prod a_i ∏ai种方法
排列
定义
从 n n n个不同元素中选出 m m m个排成一列,问产生的排列数量
P n m = n ! ( n − m ) ! = ∏ i = 0 m − 1 ( n − i ) P_{n}^{m}=\frac{n!}{(n-m)!}=\prod_{i=0}^{m-1}(n-i) Pnm=(n−m)!n!=i=0∏m−1(n−i)
组合
定义
从 n n n个不同元素中选择 m m m个,不考虑次序,问方案数
C n m = n ! m ! ( n − m ) ! = P n m m ! C_{n}^{m}=\frac{n!}{m!(n-m)!}=\frac{P_{n}^{m}}{m!} Cnm=m!(n−m)!n!=m!Pnm
性质
- C n m = C n n − m C_{n}^{m}=C_{n}^{n-m} Cnm=Cnn−m
- C n m = C n − 1 m − 1 + C n − 1 m C_{n}^{m}=C_{n-1}^{m-1}+C_{n-1}^{m} Cnm=Cn−1m−1+Cn−1m
- ( ∑ i = 0 n C n i ) = 2 n (\sum_{i=0}^{n}C_{n}^{i})=2^n (i=0∑nCni)=2n
POJ 1942 Paths on a grid
题目
给定一个 n ∗ m n*m n∗m的格子,问从左上角向上或向右走到右上角的方案数
分析
那么可以这样想,也就是题目求在 n + m n+m n+m个方向中选出 n n n个向右的方案数,那也就是 C n + m n C_{n+m}^{n} Cn+mn,然而这道题虽然好像数据很大,实际上数据非常弱,嗯,代码我就不贴了
二项式定理
定义
( a + b