离散数学排列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天
(30
52)*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
GCD

LCM



案例

维护中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值