离散数学之排列java表示
数学意义
加法原则
实现一个任务,有n种不同的方式可以选择,每种方式都可以独立完成任务,在第i种方式中,有a i种具体的实现方式。则实现这个任务的方式有N种,即
N =a1+a2+…+an
乘法原则
完成某个任务需要n个步骤,在第i步有ai种实现方式,则完成该任务的方式总数为
N=a1*a2…*an;
圆周排列
如果从包含n个不同元素集合A中任取r个元素排列成一个圆周,称为圆周排列,或简称圆排列,把从包含n个不同的元素集合A中任取r个元素排列成一个圆周的排列数记为Q(n,r)则有 Q(n,r)=A(n,r)/r
- 假如五个小朋友手牵手变成圆排列,任意两个相邻的小朋友手松开就变成了一个直排列,即,任意一种圆排列对应五个不同的直线排列。五个小朋友站成一排有5!种方法,则手拉手有5!/5=4!种方法。
除法原则
如果一个任务可以用n种方式完成,对于每种完成任务的方式恰好有d种与其对应,那么完成任务的方法数为n/d;
组合
组合A(n,r)的表示
A(n,r) -> n!/(n-r)!
k->1 limit->r
第一种写法(递归)
递归时间复制度 ->递归的次数 * 每次递归的时间复杂度。
递归算法的空间复杂度 = 每次递归的空间复杂度 * 递归深度
f(n) =f(n-1)*f(n-2)…f(1) -> 时间复杂度O(n-r+1),空间复杂度O(n-r+1)
public int digui(int n, int limit, int k){
if(n==1){
return 1;
}
if(n==0){
return 0;
}
if((k-1)==limit){
return 1;
}
return digui(n-1,limit,k+1)*n;
}
组合C(n,r)的表示
C(n,r)-> n!/r!*(n-r)!
第一种写法(递归)
digui()/cnr()
public int cnr(int r){
if(r==0){
return 0;
}
if(r==1){
return 1;
}
return r*cnr(r-1);
}
public int digui(int n, int limit, int k){
if(n==1){
return 1;
}
if(n==0){
return 0;
}
if((k-1)==limit){
return 1;
}
return digui(n-1,limit,k+1)*n;
}
组合案例
1.0 杨辉三角
C(n,r) = C(n-1,r-1) +C(n-1,r)
(a+b)^0 =C(0,0)a^0 *b^0
…
(a+b)^4 = C(4,4)a^4 *b0+C(4,3)a3 *b1+C(4,2)*a2 *b2+C(4,1)*a1 *b^3 +C(4,0)a^0 *b4
可以将上述多项式的系数排列成杨辉三角
public class tuzi {
public static void main(String[] args) {
tuzi tuzi01=new tuzi();
// C(n,r) -> factorial(n)/ factorial(n-r)*factorial(r)
int n=4;
int r=2;
int x;
for(int i=0;i<=n;i++){
for(int j=0;j<=i;j++){
x=(tuzi01.factorial(i)/ (tuzi01.factorial(i-j)* tuzi01.factorial(j)));
System.out.printf("%d"+" ",x);
}
System.out.println("");
}
}
public int factorial(int n){
if(n==1){
return 1;
}
if(n==0){
return 1;
}
return n*factorial(n-1);
}
}
2.0从 1-300中任取3个数字使其和能被3整除,有多少种方法?
思路
可以将300个数字按照除以3的余数进行分类
A={1,4,7,…,298}
B={2,5,8,…,299}
C={3,6,9,…,300}
要使组成的数字和能被3整除,共有两种分案 C(100,1)^3 +3C(100,3) =1485100
一种从每个集合取一个数,一种是从一个集合取三个数
能被3整除的特征:任意一个正整数,如果这个数能被3整除,那么这个数各位的加和也能被3整除
为什么会有这样的规律呢?
参考链接:https://baijiahao.baidu.com/s?id=1687966125278545405&wfr=spider&for=pc
首先我们来研究一下1位数:
1位数中能被3整除的数是:3,6,9, 由于只有一位数,所以各位的和就是它们本身,和可以被3整除。
结论:1位数符合规律
接下来我们研究一下2位数:
我们假设任意一个两位数A,它的十位为A2,个位数为A1
则:A=10×A2+A1=9×A2+(A2+A1)
由于9×A2一定可以被3整除,如果要A这个2位数能被3整除的话,
那么(A2+A1 )一定也能被3整除,也就是十位+个位数的和可以被3整除。
结论:2位数符合规律
在接下来研究3位数:
同样对于3位数,我们假设一个3位数A,它的百位数为A3, 十位数为A2,个位数为A1, 则:
A=100×A3+10×A2+A1=99×A3+9×A2+(A3+A2+A1)
首先99×A3和9×A2可以被3整除,要让A能被3整除,则(A3+A2+A1)要能被3整除。所以A3+A2+A1,也就是百位数+十位数+个位数的和可以被3整除。
结论:3位数符合规律
4位数的研究方法,大家可以自己试一试。
.....
现在我们来研究更高的位数的数字:
假设一个正整数A,他的最高位数的数是An,次高位为An-1,......,千位为A4,百位为A3,十位为A2,个位为A1
则:A=10^n×An+10^(n-1)×An-1+...+1000×A4+100×A3+10×A2+A1
={[9×10^(n-1)+9×10^(n-2)+...+90+9]×An+[(9×10^(n-2)+...+90+9)×An-1]+...+999×A4+99×A3+9×A2}+(An+An-1+...+A4+A3+A2+A1)
("10^n" 表示10的n次方,"×"表示相乘)
其中大括号里的部分是可以被3整除的。
要让A能被3整除,那么后面的部分,即各个位数之和可以被3整除。
结论:任意位数也符合规律。
当然这个研究过程并不是严格的数学推理,只是一个思路,引导大家更好的理解这个规律。
了解了这个规律之后,大家以后再遇到类的数学题目,相信就可以很快速的得到答案了。
3.0鸽兔同笼问题(pigeohole principle)
原理:将n+1只鸽子放进n个笼子,则至少有一个笼子里放着不少于两只鸽子(抽屉原理)
3.1从1-100中任意选51个数,那么其中一定存在两个数的和是101
A1={1,100}…A50 ={50,51} 所以任意取51个数一定有一组数在一个集合中
3.2 某校初中部有30个班,每班平均52人,已知这些学生的90%都是在1978-1980年这三年出生的,问他们中有同年同月出生的吗?
3653+1 =1096天
(3052)*0.9=1404人
1404>1095
推论若有n只鸽子住进m个笼子,则至少有一个笼子住进[(n-1)/m]+1只鸽子。其中[x]表示小于或等于x的最大整数.
参考文献
https://max.book118.com/html/2022/0408/8073056002004071.shtm
素数和最小公倍数与最大公因数
设a,b是两个整数,b!=0,如果存在整数c使a=bc,则称a被b整除,或称b整场a,记为b|a,又称a是b的倍数,b是a的因子
算术基本定理
a=p1^r1 *p2^r2…
其中p1,p2…是互不相同的素数,r1,r2…是正整数
a是正整数
最小公因数
d|a,d|b,则称d是是a和b的公因子,最大公因子
为GCD(a,b)
最大公倍数
a|d,b|d,则d为最小公倍数
LCM(a,b)
数学模型
https://www.ngui.cc/el/2877534.html?action=onClick
案例
维护中