素数的判定(素性测试)
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)” = C(n,k)
=
C(n,k)
---------------------------------------------------------------------------------------------------------------------------------
抽屉原理(鸽巢原理)
把n + 1个物品放到n个抽屉里,则至少有一个抽屉含有两个或两个以上物品
没了。
---------------------------------------------------------------------------------------------------------------------------------
容斥原理
现有 {} 总共n个集合
现在已知任意多个子集交集的大小
则所有集合并集的大小为
此即为容斥原理