2024五一 day2 笔记

本文介绍了素数判定中的Miller-Rabin素性测试方法,以及线性筛法用于找出最小质数并剔除非质数的步骤,包括避免重复筛选的基本策略。同时提及了基本计数原理、排列组合和容斥原理在数学问题中的应用。
摘要由CSDN通过智能技术生成

素数的判定(素性测试)

        Miller-Rabin素性测试

                如果𝑜 为素数,取𝑏 < 𝑜 ,设𝑜 − 1 = 𝑒 × 2𝑟 ,则要么𝑏𝑑 ≡ 1(mod 𝑜),

                要么0 ≤ 𝑖 < 𝑠, 𝑡. 𝑢. 𝑏𝑑×2𝑖 ≡ −1(mod 𝑜).

                常规做法:选取𝑙个不同的数进行miller-rabin素性测试,如果都通过则为质数。

                

        线性筛法

                1.最小质数
                由公理可知,n都可以被分解为多个质数的乘积,那么,在这些质数中,我们总能找到一个最小的数x,那么x就是n的最小质数

                2.剔除非质数
                既然有了最小质数x,针对每一个数,我们只需要从2开始,逐条对2-n进行遍历(假设我们此时遍历到的数是i),如果发现i%x=0,

                那么我们就知道这个数要被剔除掉因为它可以被至少两个数的乘积表示(不满足质数的定义)

                3.如何保证不重复剔除非质数?
                我们知道,45可以是315,或者是是59,如果我们按照第二步的想法,必将重复筛掉45两次,如果n足够大,这将会有很多重复操作,是不可接受的

                那么我们该怎么做?

                很简单,我们只要保证如一开始所说的,让45被他的最小质数(3)给筛掉就行,那么又该怎么做?

                if(i%pri[j]==0)break;
        这句话有什么意义?我们来打个比方,如果此时的i=4,即12=223=3*4,我们需要让12被2给筛掉

        那么当pri[j]=2时,我们就要停止这个for循环了,为什么要这么做?

                vis[pri[j]i]=1;
                很简单,因为i此时能被2(i=12=22*3),那么我们可不可以断言,x = pri[j] * i = pri[j] * 2 * k

                (也就是说x的最小质数是2)也可以被2给表示?

                答案是肯定的,由此我们可以推断,我们此时不break,就会在这次循环筛掉12(3*4,通过3筛掉12)

                但是下一轮循环我们又会通过2*6筛掉12,这显然不符合我们的目的,保证每个数被筛一次,所以我们只要

        确保每个数被自己的最小质数筛掉,换言之,就是当i能被当前的质数整除时(当前整数就是i的最小质数),

                就break,这样后面的数(后面所有含有i的数不会被当前循环筛掉)就不会被重复筛掉。

                代码:

int pri[N+9>>1],now;
bool vis[N+9];
void init(){
    for(int i=2;i<=N;i++){
        if(!vis[i])pri[++now]=i;
        for(int j=1;j<=now&&pri[j]*i<=N;j++){
            vis[pri[j]*i]=1;
            if(i%pri[j]==0)break;
        }
    }
}

--------------------------------------------------------------------------------------------------------------------------------

基本计数原理

        加法原理

                 例:

                从A地到B地陆地有2条,水路有3条。从A地到B地一共有几种道路?

                解:2 + 3 = 5(条)

                没了。

        乘法原理

                例:

                从A地到B地,一共有2条道,从A地到C地,一共有3条道,那么从A地到B地一共有几种走法?

                解:2 * 3 = 6(种)

                没了。

---------------------------------------------------------------------------------------------------------------------------------

排列组合

        排列

                从𝑜个元素中选取𝑠个元素,当考虑顺序时,其方案数为:

       组合

                从𝑜个元素中选取𝑠个元素,当不计顺序时,其方案数为:

        组合数及其相关性质

                C(n +m,n)= C(n + m,m)
                C(n,m)= C(n-1,m-1)+ C(n - 1,m)
                C(n +r +1,r)= C(n +r,r)+C(n+r-1,r-1)+…+ C(n,0)
                C(n,l)C(l,r)= C(n,r)C(n-r,l-r)
                C(n,0)+ C(n,1)+…+ C(n,n)= 2n
                C(n,0)- C(n,1)+ C(n,2) -…=0
                C(r,r) + C(r + 1,r)+…+C(n,r)= C(n + 1,r +1)
                (1 + x)” = \sum _{k = 1} ^ n C(n,k)x ^ {n - k} = \sum _{k = 0} ^ n C(n,k)x ^ k

---------------------------------------------------------------------------------------------------------------------------------

抽屉原理(鸽巢原理)

        把n + 1个物品放到n个抽屉里,则至少有一个抽屉含有两个或两个以上物品

        没了。

---------------------------------------------------------------------------------------------------------------------------------

容斥原理

        现有 {A_{1}, A_{1}, ..., A_{n}} 总共n个集合

        现在已知任意多个子集交集的大小

        则所有集合并集的大小为

        \sum _{B\subseteq \left \{ A_{1}, A_{1}, ... , A_{n}\right \}}\left ( -1 \right )^{\left | B\right | + 1}\cdot |\cap _{Ai\in B}A_i|

        此即为容斥原理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值