排列
概念:从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号
A
n
m
A^m_n
Anm 表示,有时也写作 A(n, m)。
A
n
m
=
n
!
(
n
−
m
)
!
A^m_n = \frac{n!}{(n-m)!}
Anm=(n−m)!n!
= n ∗ ( n − 1 ) ∗ ( n − 2 ) . . . 2 ∗ 1 ( n − m ) ∗ ( n − m − 1 ) ∗ ( n − m − 2 ) . . . 2 ∗ 1 = \frac{n*(n-1)*(n-2)...2*1}{(n-m)*(n-m-1)*(n-m-2)...2*1} =(n−m)∗(n−m−1)∗(n−m−2)...2∗1n∗(n−1)∗(n−2)...2∗1
= n ∗ ( n − 1 ) ∗ ( n − 2 ) . . . ( n − m + 1 ) =n*(n-1)*(n-2)...(n-m+1) =n∗(n−1)∗(n−2)...(n−m+1)
全 排 列 : A n n = n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ 1 叫 做 n 的 阶 乘 全排列:A_n^n = n! = n*(n-1)*(n-2)*...*1\quad叫做 n的阶乘 全排列:Ann=n!=n∗(n−1)∗(n−2)∗...∗1叫做n的阶乘
另 规 定 : 0 ! = 1 , 因 为 0 本 身 也 是 一 种 情 况 . 另规定:\quad 0! = 1,因为 0本身也是一种情况. 另规定:0!=1,因为0本身也是一种情况.
组合
概念:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C n m C_n^m Cnm表示,有时也写作 C(n, m) 。
C n m = A n m A m m = n ! ( n − m ) ! m ! = n ! ( n − m ) ! ∗ m ! C^m_n =\frac{A^m_n}{A_m^m} = \frac{\frac{n!}{(n-m)!}}{m!} = \frac{n!}{(n-m)! * m!} Cnm=AmmAnm=m!(n−m)!n!=(n−m)!∗m!n!
= n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ ( n − m + 1 ) m ! = \frac{n*(n-1)*(n-2)*...*(n-m+1)}{m!} =m!n∗(n−1)∗(n−2)∗...∗(n−m+1)
公 式 替 换 : C n m = C n n − m , 其 中 ( n ≥ m ) . 公式替换: \quad C^m_n = C_n^{n-m} ,其中(n\ge m). 公式替换:Cnm=Cnn−m,其中(n≥m).
另 规 定 : C n 0 = C n n = 1 另规定:C_n^0 = C_n^n = 1 另规定:Cn0=Cnn=1
推 导 公 式 : P = A m 1 A n 1 = m ! ( m − 1 ) ! n ! ( n − 1 ) ! = m ! ( n − 1 ) ! ( m − 1 ) ! n ! = m n 推导公式:P = \frac{A^1_m}{A^1_n} = \frac{\frac{m!}{(m-1)!}}{\frac{n!}{(n-1)!}} = \frac{m!(n-1)!}{(m-1)!n!} = \frac{m}{n} 推导公式:P=An1Am1=(n−1)!n!(m−1)!m!=(m−1)!n!m!(n−1)!=nm
推 导 公 式 : P = C m 1 C n 1 = A m 1 A 1 1 A n 1 A 1 1 = A m 1 A n 1 = m n 推导公式:P = \frac{C^1_m}{C^1_n} = \frac{\frac{A^1_m}{A^1_1}}{\frac{A^1_n}{A^1_1}} =\frac{A^1_m}{A^1_n} = \frac{m}{n} 推导公式:P=Cn1Cm1=A11An1A11Am1=An1Am1=nm
可以把从n个数中选m个数的组合分为2类
- 不含第n个数的组合,方案数为: C n − 1 m C_{n-1}^{m} Cn−1m
- 含第n个数的组合,方案数为: C n − 1 m − 1 C_{n-1}^{ m-1} Cn−1m−1
所以 C n m = C n − 1 m − 1 + C n − 1 m − 1 C_n^m = C_{n-1}^{m-1} + C_{n-1}^{m-1} Cnm=Cn−1m−1+Cn−1m−1
洛谷问题:P2181 对角线
题目描述
对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。
请求出图形中对角线交点的个数。
输入格式:输入只有一行一个整数 n,代表边数。
输出格式:输出一行一个整数代表答案。
输入输出样例
输入:3
\quad\quad
输出:0
输入:6
\quad\quad
输出:15
说明/提示
数据规模与约定
对于 50 % 的数据,保证
3
≤
n
≤
100
3≤n≤100
3≤n≤100 。
对于 100 % 的数据,保证
3
≤
n
≤
1
0
5
3≤n≤10^5
3≤n≤105。
洛谷问题:P2181 对角线解答
已知:保证任何三条对角线都不会交于一点
推导如下:
- 每两个顶点连一条对角线
- 每两条对角线有一个顶点
- 所以每一个交点对应四个顶点
则问题转化为:从n个顶点之中选出4个,有多少种选法?
由于四个顶点无序,所以是组合问题,那么结果就是: C n 4 C^4_n Cn4
C n 4 = A n 4 A 4 4 = n ! ( n − 4 ) ! 4 ! C^4_n =\frac{A^4_{n}}{A_4^4} =\frac{ \frac{n!}{(n-4)!}} {4!} Cn4=A44An4=4!(n−4)!n!
= n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) 4 ! =\frac{n*(n-1)*(n-2)*(n-3)}{4!} =4!n∗(n−1)∗(n−2)∗(n−3)
程序实现
知道公式了,也就能解决问题了,但是这里出现了高精度问题
因为
n
=
[
3
,
1
e
5
]
n = [3,1e5]
n=[3,1e5],unsigned long long 对应的最大值为
2
64
−
1
=
1.8
e
19
2^{64}-1 = 1.8e19
264−1=1.8e19.
ULLONGMAX =18446744073709551615
交
点
个
数
=
n
∗
(
n
−
1
)
∗
(
n
−
2
)
∗
(
n
−
3
)
/
4
!
交点个数 = n*(n-1)*(n-2)*(n-3)/4!
交点个数=n∗(n−1)∗(n−2)∗(n−3)/4!
1 e 5 ∗ 1 e 5 ∗ 1 e 5 ∗ 1 e 5 = 1 e 20 > p o w ( 2 , 64 ) − 1 1e5 * 1e5 * 1e5 * 1e5 =1e20 > pow(2,64)-1 1e5∗1e5∗1e5∗1e5=1e20>pow(2,64)−1
所以需要解决这个问题:
发现规律
n,n-1 中必然有个数能被2 整除
n, n-1, n-2 中必然有个数能被3 整除
n, n-1, n-2, n-3 中必然有个数能被4 整除
所以
交
点
个
数
=
n
∗
(
n
−
1
)
∗
(
n
−
2
)
∗
(
n
−
3
)
/
4
!
交点个数 = n*(n-1)*(n-2)*(n-3)/4!
交点个数=n∗(n−1)∗(n−2)∗(n−3)/4!
可以改写为
交
点
个
数
=
n
∗
(
n
−
1
)
/
2
∗
(
n
−
2
)
/
3
∗
(
n
−
3
)
/
4
交点个数 = n*(n-1)/2*(n-2)/3*(n-3)/4
交点个数=n∗(n−1)/2∗(n−2)/3∗(n−3)/4
#include<iostream>
#include<climits>
#include<cmath>
using namespace std;
unsigned long long n,ans;// 2^64-1 = 18446744073709551615 = 1.84467e+019
int main(){
cin>>n;// n = [3,1e5]
ans = n*(n-1)/2*(n-2)/3*(n-3)/4;
cout<<ans;
// cout<<pow(2,64)-1<<endl;//1.84467e+019
// cout<<ULLONG_MAX<<endl;//18446744073709551615
// 1e5 * 1e5 * 1e5 * 1e5 =1e20 > pow(2,64)
return 0;
}
那么如果问怎么求对角线条数呢?
容易得出公式:对角线条数 =
n
∗
(
n
−
3
)
/
2.
n*(n-3)/2.
n∗(n−3)/2.
n | 3 | 4 | 5 | 6 | 7 | 8 | … | n |
---|---|---|---|---|---|---|---|---|
规律 | 0 | 4 ∗ 1 2 \frac{4*1}{2} 24∗1 | 5 ∗ 2 2 \frac{5*2}{2} 25∗2 | 6 ∗ 3 2 \frac{6*3}{2} 26∗3 | 7 ∗ 4 2 \frac{7*4}{2} 27∗4 | 8 ∗ 5 2 \frac{8*5}{2} 28∗5 | … | n ∗ ( n − 3 ) 2 \frac{n*(n-3)}{2} 2n∗(n−3) |
对角线条数 | 0 | 1 | 5 | 9 | 14 | 20 | … | n ∗ ( n − 3 ) 2 \frac{n*(n-3)}{2} 2n∗(n−3) |
二项式
( a + b ) n = C n 0 a n + C n 1 a n − 1 b + C n 2 a n − 2 b 2 + . . . + C n r a n − r b r + . . . + C n n b n (a+b)^n = C_n^0a^n+C_n^1a^{n-1}b+C_n^2a^{n-2}b^2+...+C_n^ra^{n-r}b^r+...+C_n^nb^n (a+b)n=Cn0an+Cn1an−1b+Cn2an−2b2+...+Cnran−rbr+...+Cnnbn
展开式共n+1项,第r+1项: T r + 1 = C n r a n − r b r ( r = 0 , 1 , 2... n ) T_{r+1} = C_n^ra^{n-r}b^r (r=0,1,2...n) Tr+1=Cnran−rbr(r=0,1,2...n)称为二项式展开式的通项,其中组合数 C n r C_n^r Cnr叫做第(r+1)项的二项式系数。
注意:项的系数和二次项系数是不同的概念,当a=b=1时,系数就是二项式系数.
举例: ( 2 a + b ) n (2a+b)^n (2a+b)n 第r+1项: T r + 1 = C n r ( 2 a ) n − r b r = 2 n − 1 C n r a n − 1 b r T_{r+1}=C_n^r(2a)^{n-r}b^r = 2^{n-1}C_n^ra^{n-1}b^r Tr+1=Cnr(2a)n−rbr=2n−1Cnran−1br,其中 2 n − 1 C n r 2^{n-1}C_n^r 2n−1Cnr 叫做第(r+1)项的系数。
当 a=b=1时,容易推导出下列公式:
C
n
0
+
C
n
1
+
C
n
2
+
.
.
.
+
C
n
n
−
1
+
C
n
n
−
1
+
C
n
n
=
2
n
C_n^0+C_n^1+C_n^2+...+C_n^{n-1}+C_n^{n-1}+C_n^n = 2^n
Cn0+Cn1+Cn2+...+Cnn−1+Cnn−1+Cnn=2n
C n 0 + C n 2 + C n 4 + . . . = C n 1 + C n 3 + C n 5 + . . . = 2 n − 1 C_n^0+C_n^2+C_n^4+... = C_n^1+C_n^3+C_n^5+... = 2^{n-1} Cn0+Cn2+Cn4+...=Cn1+Cn3+Cn5+...=2n−1
【例】 ( x 2 + 1 x 2 ) (x^2+\frac{1}{x^2}) (x2+x21)的二项式展开式中各项展开式的系数和为64,则二项式展开式中常数项为( \quad )
2 n = 64 , 所 以 n = 6 2^n=64,所以 n=6 2n=64,所以n=6
T r + 1 = C n r ( x 2 ) 6 − r ( 1 x 2 ) r = 6 ! ( 6 − r ) ! ∗ r ! ∗ x 12 − 4 r T_{r+1} = C_n^r(x^2)^{6-r}(\frac{1}{x^2})^r = \frac{6!}{(6-r)!* r!} * x^{12-4r} Tr+1=Cnr(x2)6−r(x21)r=(6−r)!∗r!6!∗x12−4r
12 − 4 r = 0 , 所 以 r = 3 12-4r = 0,所以r=3 12−4r=0,所以r=3
6 ! ( 6 − r ) ! ∗ r ! = 6 ! ( 6 − 3 ) ! ∗ 3 ! = 6 ∗ 5 ∗ 4 3 ∗ 2 ∗ 1 = 20 \frac{6!}{(6-r)!* r!} = \frac{6!}{(6-3)!* 3!} = \frac{6*5*4}{3*2*1} =20 (6−r)!∗r!6!=(6−3)!∗3!6!=3∗2∗16∗5∗4=20