重要声明:此文面向初学者
真心推荐Typora,对于与我类似的markdown/LaTeX初学者尤其方便
进入正题:众所周知,杨辉三角形(也称“帕斯卡三角形”,后同)长这样↓
即每一项等于左上方的数加右上方的数的和
学编程的人一般看作这样↓
即每一项等于左上方的数与上方的数之和。
写个简单的递推式。
#include<stdio.h>
const int maxn=1e4+5;
int f[maxn],n;
int main(){
scanf("%d",&n);f[1][1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j]=f[i-1][j-1]+f[i-1][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
printf("%3d%c",f[i][j],j==i?'\n':' ');
return 0;
}
杨辉三角长啥样都知道了,那它与组合数有啥关系呢?
关系: C n m C^m_n Cnm的值等于杨辉三角形第n行第m个数
递推公式: C n m = C n − 1 m − 1 + C n − 1 m C^m_n=C^{m-1}_{n-1}+C^{m}_{n-1} Cnm=Cn−1m−1+Cn−1m
关系可以由递推公式得到。
实际上这里才进入正题
我就是来证个递推公式的
公式特写(Typora):
公式特写(Word)(感觉Word公式的效果好丑) :
代码啥的统一放后面了(因为太长了,而且突然想起没讲这玩意↓)。
C
n
m
=
n
!
m
!
(
n
−
m
)
!
C^m_n=\tfrac {n!}{m!\left(n-m\right)!}
Cnm=m!(n−m)!n!
这个通项公式咋来的呢?
组合公式就是由排列公式去掉重复的部分得到的
C
n
m
=
A
n
m
m
!
C^m_n=\dfrac{A^m_n}{m!}
Cnm=m!Anm
以下摘自百度百科并进行了LaTeX处理:
定义及公式
排列的定义:从 n n n个不同元素中,任取 m m m( m ≤ n m\le n m≤n, m , n m,n m,n均为自然数,下同)个不同的元素按照一定的顺序排成一列,叫做从 n n n个不同元素中取出 m m m个元素的一个排列;从 n n n个不同元素中取出 m ( m ≤ n ) m\left(m\le n\right) m(m≤n)个元素的所有排列的个数,叫做从 n n n个不同元素中取出 m m m个元素的排列数,用符号 A n m A^m_n Anm表示。
计算公式: A n m = n ( n − 1 ) ( n − 2 ) . . . . . . ( n − m + 1 ) = n ! ( n − m ) ! A^m_n=n(n-1)(n-2)......(n-m+1)=\dfrac{n!}{(n-m)!} Anm=n(n−1)(n−2)......(n−m+1)=(n−m)!n!
此外规定0! = 1
组合的定义:从 n n n个不同元素中,任取 m ( m ≤ n ) m\left(m\le n\right) m(m≤n)个元素并成一组,叫做从 n n n个不同元素中取出 m m m个元素的一个组合;从 n n n个不同元素中取出 m ( m ≤ n ) m\left(m\le n\right) m(m≤n)个元素的所有组合的个数,叫做从 n n n个不同元素中取出 m m m个元素的组合数。用符号 C n m C^m_n Cnm表示。
计算公式: C n m = A n m m ! = n ! m ! ( n − m ) ! ; C n m = C n n − m . ( n ≥ m ) C^m_n=\dfrac{A^m_n}{m!}=\dfrac{n!}{m!(n-m)!};C^m_n=C^{n-m}_n.(n\ge m) Cnm=m!Anm=m!(n−m)!n!;Cnm=Cnn−m.(n≥m)
笔者小计: C n m = C n n − m C^m_n=C^{n-m}_n Cnm=Cnn−m应该属于性质公式。。。
符号:
C − C o m b i n a t i o n C -Combination C−Combination 组合数
A − A r r a n g e m e n t A -Arrangement A−Arrangement 排列数(在旧教材为 P − P e r m u t a t i o n P-Permutation P−Permutation)
N − N u m b e r N -Number N−Number 元素的总个数
M − M - M− 参与选择的元素个数
! − F a c t o r i a l ! - Factorial !−Factorial阶乘
个人认为排列组合数的定义和公式看完上述段落应该就会了。
关于排列组合数的性质这里就不再赘述(毕竟是初学者篇),请自行查询。
Markdown+LaTeX (Used Typora):
CSDN似乎不支持\begin{align}
,所以只能放个截图再加个代码了。。
Markdown+LaTeX代码:
$$
C^{m}_{n}=\tfrac {n!}{m!\left( n-m\right) !}\\
\begin{align}
&C_{n-1}^{m-1}+C_{n-1}^{m}\\
=&\tfrac{\left(n-1\right)!}{(m-1)![n-1-(m-1)]!}+\tfrac{(n-1)!}{m!(n-1-m)!}\\
=&\tfrac{\left(n-1\right)!}{(m-1)!(n-m)!}+\tfrac{(n-1)!}{m!(n-1-m)!}\\
=&\tfrac{m\left(n-1\right)!}{m!(n-m)!}+\tfrac{(n-m)(n-1)!}{m!(n-m)!}\\
=&\tfrac{m\left(n-1\right)!+(n-m)(n-1)!}{m!(n-m)!}\\
=&\tfrac{m\left(n-1\right)!+n!-m(n-1)!}{m!(n-m)!}\\
=&\tfrac{n!}{m!(n-m)!}\\
=&C_n^m
\end{align}
$$
Word代码:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<msubsup>
<mi>C</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msubsup>
<mo>=</mo>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mi>n</mi>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mrow>
<mo>(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo>)</mo>
</mrow>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
<mspace linebreak="newline" />
<mtable columnalign="right left right left right left right left right left right left" rowspacing="3pt" columnspacing="0em 2em 0em 2em 0em 2em 0em 2em 0em 2em 0em" displaystyle="true">
<mtr>
<mtd />
<mtd>
<msubsup>
<mi>C</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msubsup>
<mo>+</mo>
<msubsup>
<mi>C</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msubsup>
</mtd>
</mtr>
<mtr>
<mtd>
<mo>=</mo>
</mtd>
<mtd>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mrow>
<mo>(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mo>!</mo>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mi>m</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>!</mo>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mo stretchy="false">(</mo>
<mi>m</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo stretchy="false">]</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
<mo>+</mo>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
</mtd>
</mtr>
<mtr>
<mtd>
<mo>=</mo>
</mtd>
<mtd>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mrow>
<mo>(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mo>!</mo>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mi>m</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
<mo>+</mo>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
</mtd>
</mtr>
<mtr>
<mtd>
<mo>=</mo>
</mtd>
<mtd>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mi>m</mi>
<mrow>
<mo>(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
<mo>+</mo>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
</mtd>
</mtr>
<mtr>
<mtd>
<mo>=</mo>
</mtd>
<mtd>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mi>m</mi>
<mrow>
<mo>(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mo>!</mo>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
</mtd>
</mtr>
<mtr>
<mtd>
<mo>=</mo>
</mtd>
<mtd>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mi>m</mi>
<mrow>
<mo>(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mo>!</mo>
<mo>+</mo>
<mi>n</mi>
<mo>!</mo>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
</mtd>
</mtr>
<mtr>
<mtd>
<mo>=</mo>
</mtd>
<mtd>
<mstyle displaystyle="false" scriptlevel="0">
<mfrac>
<mrow>
<mi>n</mi>
<mo>!</mo>
</mrow>
<mrow>
<mi>m</mi>
<mo>!</mo>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mstyle>
</mtd>
</mtr>
<mtr>
<mtd>
<mo>=</mo>
</mtd>
<mtd>
<msubsup>
<mi>C</mi>
<mi>n</mi>
<mi>m</mi>
</msubsup>
</mtd>
</mtr>
</mtable>
</math>
欢迎挑错。