组合数学
排列与组合
抽屉原理(鸽巢原理)
把n+1个苹果放入n个抽屉里,则至少有一个抽屉放了两个或两个以上的苹果;
从另一个角度来说,把n-1个苹果放入n个抽屉,则至少有一个抽屉是空的。
如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素。
假如有n+1个元素放入n个集合,其中必定有一个集合里至少有两个元素;
把n-1个元素放入n个集合,则至少有一个集合是空的。
通常来说,在问题中,较多的一方就是苹果,较少的一方就是抽屉。
最差原则
即考虑所有可能的情况中,最不利于某件事情 发生的情况。
容斥原理
基本计数原理
分类加法计数原理
做一件事,完成它有 \(n\) 类方法,第一类有 \(m_{1}\) 种,第二类有 \(m_{2}\) 种,……,第 \(n\) 类有 \(m_{n}\) 种,那么完成这件事共有 $ s=m_{1}+m_{2}+…+m_{n}$ 种方法。
特点
分类加法计数原理与分类有关,各种方法相互独立,用其中任一方法都可以完成这件事。
特点是分类独立完成,分类计数。
分步乘法计数原理
做一件事,完成它需要 \(n\) 个先后步骤,做第一步有 \(m_{1}\) 种不同的方法,做第二步有 \(m_{2}\) 种不同的方法,……,做第n步有 \(m_{n}\) 种不同的方法,那么完成这件事共有 \(s=m_{1}×m_{2}×…m_{n}\) 种不同的方法。
特点
分步乘法计数原理与分步有关,各个步骤相互依存,只有各个步骤都完成了,这件事才算完成。
特点是分步依次完成,分步计数。
区别
加法原理是“分类完成”,乘法原理是“分步完成”。
排列与组合
定义
阶乘
\(n!=1×2×…×n\)
\(\left( 0!=1 \right)\)
排列
从n个不同元素中任取m(m<=n)个元素,按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列。
对于第一个位置,我们有n种选择;第二个位置,有(n-1)种选择;……;第m个位置,有(n-m+1)种选择;所以,
方案数 \(=n(n- 1)…(n-m+1)\),即

当 \(m=n\) 时,有 \(A^{n}_{n}=n!\) ,称为 \(n\) 的全排列(n个不同元素全部取出的排列);
而 \(0<m<n\) 的情况,则称为选排列。
组合
从n个不同元素中,任意取出m(m<=n)个元素并成一组,叫做从n个不同元素中任意取出m个元素的一个组合。
我们考虑从n个物品中选出m个物品的排列,由于在组合中不考虑顺序性,所以每一种组合在排列中重复出现了 \(m!\) 次,所以只需要将排列数除以m!,即


区别
取出的元素与顺序有关的为排列问题,与顺序无关的为组合问题。
公式







该公式是二项式定理,可以证明第三个公式。

Lucas定理
用于求解大组合数取模的问题,其中模数必须为素数。


n%p和m%p一定是小于p的数,可直接求解;
\(C^{m/p}_{n/p}\)可继续用lucas定理求解。这也要求p的范围不能太大,<=\(10^{5}\)左右。
边界条件:当m=0时返回1,即, \(lucas(x,0,p)=1\)


杨辉三角
(a+b)n展开式的二项式系数:

性质
性质1
每行两端都是1,每个数都等于它“肩上”的两个数的和。

性质2
每一行中,与首末两端“等距离”的两个数相等。

性质3
如果二项式的幂指数\(n\)是偶数,则展开中间项\(T_{n/2+1}\)的二项式系数最大;如果\(n\)是奇数,展开的中间两项\(T_{(n+1)/2}\)和\(T_{(n+1)/2+1}\)的系数最大。
性质4
二项式每行的系数和等于2n。

组合数求解
用组合数递推公式求解。
复杂度\(O(n^{2})\)
初始条件:


组合数学相关
错排、圆排列
基础数论
取整
x是一个实数,floor(x)为对x向下取整,ceil(x)为对x向上取整。
在c++中,整型变量的除法都是整除的。我们一般考虑除 数为正的情况。若被除数为正,则向下取整;为负则向上取整。
总结,向绝对值小的方向取整。
下取整符号 $\left \lfloor \right \rfloor $
上取整符号 $\left \lceil \right \rceil $
取模
a对b取模得到的结果就是a除以b的余数,记作a mod b。
\(x≡y(\) % \(p)\) 表示x与y对p取模的结果相等,称为同余。
性质
假设x≡y(%p)
x+a≡y+a(%p)
x-a≡y-a(%p)
ax≡ay(%p)
(a+b)%p=(a%p+b%p)%p
(a-b)%p=(a%p–b%p)%p
(a-b)%p=(a-b+p)%p
ab%p=(a%p)(b%p)%p
最大公约数(gcd)/最小公倍数(lcm)
如果a%x=0,我们称x是a的约数(或因数),称a是x的倍数。
a与b的最大公约数,是指一个最大的整数x,使得x同时是a和b的约数。
我们将a与b的最大公约数记作gcd(a,b)。
性质
lcm(a,b)=ab/gcd(a,b)
gcd(a,b,c)=gcd(gcd(a,b),c)
lcm(a,b,c)=lcm(lcm(a,b),c)
欧几里得算法(辗转相除法)
时间复杂度为log级。
算法公式


证明

质数(素数)
一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,这样的数称为质数,否则称为合数。
逆元
对于正整数a,b,如果能找到正整数x使得 \(ax≡1(\) % \(b)\) ,我们称x是a在模b意义下的逆元。
在这里,实际上a与x互为模b意义下的逆元。
由同余方程可知,a在模b意义下存在逆元,当且仅当gcd(a,b)=1,即a与b互质。
在取模的意义下是不能直接作除法的,但利用逆元则可以。
在模意义下,除以一个数,相当于乘上这个数的逆元;或者说乘以一个数,等于除以这个数的逆元。
概率和数学期望
概率
某个事件A发生的可能性的大小,称之为事件A的概率,记作P(A)。
假设某事的所有可能结果有n种,事件A涵盖其中的m 种,那么P(A)=m/n。
如果两个事件A和B所涵盖的结果没有交集(互不相容),那么P(A或B发生)=P(A)+P(B)。
如果A和B所涵盖的结果有交集,那么P(A或B发生)=P(A)+P(B)-P(A与B同时发生)。
记事件B为“事件A不发生”(事件A的对立事件,事件B发生则事件A不会发生)那么P(A)+P(B)=1,即P(B)=1-P(A)。
在两个互不干扰的事中,事件A在其中一件事中,事件B在另外一件事中(独立事件,事件A发生跟B的发生没有关系),那么P(A与B同时发生)=P(A)×P(B)。
数学期望
事件A有多种结果,记其结果为x,那么x的期望值表示事 件A的结果的平均大小,记作E(x)。
E(x)=每种结果与其概率的乘积的和
记两个事件的结果分别为x、y,那么,E(x+y)=E(x)+E(y)
若两个事件互相独立,那么,E(xy)=E(x)·E(y)
若c为常数,那么,E(x+c)=E(x)+c,E(cx)=c·E(x)
并非原创,仅是整理,请见谅
一.引言本文将对NTL开源库进行分析与学习。NTL:是一个高性能、可移植的C++库,为任意长度的整数提供数据结构和算法;用于整数和有限域上的向量、矩阵和多项式;以及任意精度的浮点运算。NTL为以下领域提供最先进且高质量的算法实现:任意长度整数运算和任意精度浮点运算;整数和有限域上的多项式算术,包括基本算术、多项式分解、不可约判定、最小多项式计算、迹线、范数等计算;格基归约,包括非常健壮和快速的Schnorr-Euchner,实现、块Korkin-Zolotarev归约,以及块Korkin-Zolotarev的新Schnorr-Horner剪枝启发式;整数、有限域和任意精度浮点数的基本线性代数。
给定两个正整数a,b(1L={x*y|1^是异或操作对于任意两个整数:A∈L,B∈R,我们将B格式化为n+1(n为b的十进制数)十进制数(在B前填0),然后将Bunion到A的末尾,得到一个新的整数AB。计算所有生成的整数AB的总和(如果总和超过,则返回“summod1000000007”,mod表示模运算)注意:你的算法时间不超过3秒我的算法很简单:我们很容易得到集合R中的最大数,R中的元素是0,1,2,3...maxXor,(元素max(a,b)可能不在R)中,使用哈希表计算集L。但是当a=30,b=100000时算法消耗4秒。举个例子:a=2,b=4,soL={1*1,1*2,1
数论入门提到数论,可能很多人都感到很头疼,甚至很多时候遇到一些问题,看到成篇的证明都会感到恐惧,而且由于关于ACM方面的数论资料,网上资料都比较驳杂。有时候很容易出现知其然不知其所以然的情况。所以今天给大家介绍一些关于数论入门最基础的知识和算法,内容会尽量从0基础开始,所以内容会尽量详细。不过其中部分证明还是需要一些高中数学基础的。由于内容很多,我整理了一个目录,按顺序讲今天的内容.目录一.合数,质数,整除,互质,同余,取模等基础概念。二.欧几里得算法三.扩展欧几里得四.费马小定理五.欧拉函数六.欧拉降幂七.素数筛八.快速幂九.逆元的用处和几种简单求法十.中国剩余定理一.数论中的基础概念和符号
数论知识本文主要介绍整除、质数和合数、同余定理、模逆元素、欧几里得除法、欧拉函数、欧拉定理、费马小定理、中国剩余定理(孙子定理)。文章目录数论知识简介一、整除二、质数和合数三、同余定理模逆元素四、Euclid(欧几里得)除法可以利用辗转相除法求最大公因子六、欧拉(Euler)函数欧拉定理七、费马小定理八、中国剩余定理CRT总结简介最近学习了公钥算法,涉及了一些数论中的知识。对一些数论的基础知识做一下总结。gcd是最大公约数。lcm是最小公倍数。一、整除a,b是任意的两个整数,b不为0,存在整数q,使得a=qb。记作:b|a二、质数和合数除了平凡约数±1和±n之外,n没有其他的因数。则n是质数(
大家好,我是爱分享的小蓝,欢迎交流指正~ 全文目录🧭🏆算式900⭐🚀传送锚点 💡思路点拨🍞代码详解 🏆神奇算式⭐⭐🚀传送锚点 💡思路点拨🍞代码详解 🏆带分数⭐⭐⭐🚀传送锚点 💡思路点拨🍞代码详解 🏆算式900⭐🚀传送锚点(□□□□-□□□□)*□□=900(5012-4987)*36=900 💡思路点拨1、审题:先看题目给出的条件:“这 10 个方块刚好包含了 0 ~ 9 中的所有数字”。2、建模:看到熟悉的题目条件,条件反射全排列函数permutations(╹ڡ╹)3、判断:枚举所有排列情况,用字符串分割出方块a,b,c=int(s[:4]),int(s[4:8]),in
1、快速幂 1.1运算模定义:模运算为a除以m的余数,记为amodm,有amodm=a%m。模运算是大数运算中的常用操作:如果一个数太大,无法直接输出,或者不需要直接输出,可以把它取模后,缩小数值再输出。Python虽然能直接计算大数,不用担心数据溢出,但是大数乘法太耗时,所以也常用取模来缩小数值。一个简单应用,判断奇偶:a%2==0,a是偶数;a%2==1,a是奇数例题一:刷题统计 2022年第十三届省赛,lanqiao0J题号209问题描述小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现
1、快速幂 1.1运算模定义:模运算为a除以m的余数,记为amodm,有amodm=a%m。模运算是大数运算中的常用操作:如果一个数太大,无法直接输出,或者不需要直接输出,可以把它取模后,缩小数值再输出。Python虽然能直接计算大数,不用担心数据溢出,但是大数乘法太耗时,所以也常用取模来缩小数值。一个简单应用,判断奇偶:a%2==0,a是偶数;a%2==1,a是奇数例题一:刷题统计 2022年第十三届省赛,lanqiao0J题号209问题描述小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现
GCD 最大公约数GreatestCommonDivisor(GCD):整数a和b的GCD是指能同时整除a和b的最大整数,记为gcd(a,b)。由于-a的因子和a的因子相同,因此gcd(a,b)=gcd(al,|bl)。编码时只关注正整数的最大公约数。GCD性质(1)gcd(a,b)=gcd(a,a+b)=gcd(a,k·a+b)(2)gcd(ka,kb)=kgcd(a,b)(3)定义多个整数的最大公约数:gcd(a,b,c)=gcd(gcd(a,b),c)。(4)若gcd(a,b)=d,则gcd(a/d,b/d)=1,即a/d与b/d互素。这个定理很重要。(5)gcd(a+cb,b)=gcd
GCD 最大公约数GreatestCommonDivisor(GCD):整数a和b的GCD是指能同时整除a和b的最大整数,记为gcd(a,b)。由于-a的因子和a的因子相同,因此gcd(a,b)=gcd(al,|bl)。编码时只关注正整数的最大公约数。GCD性质(1)gcd(a,b)=gcd(a,a+b)=gcd(a,k·a+b)(2)gcd(ka,kb)=kgcd(a,b)(3)定义多个整数的最大公约数:gcd(a,b,c)=gcd(gcd(a,b),c)。(4)若gcd(a,b)=d,则gcd(a/d,b/d)=1,即a/d与b/d互素。这个定理很重要。(5)gcd(a+cb,b)=gcd
DAY10共2题:月月给华华出题华华给月月出题难度较大。?作者:Eriktse?简介:211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)??原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/1104.html在做今天这两道题之前,强烈建议先看这篇文章《【ACM数论】和式变换技术,也许是最好的讲解之一》。月月给华华出题题目传送门:https://ac.nowcoder.com/acm/problem/23048当N=n时,我们可以得到以下式子:\[