数论(自学)
零、说在前面
0.1 感谢
感谢百度百科、oi-wiki、洛谷的题目。
0.2 阅读前须知
作者很菜,不要看。如果有错误,私信即可,一周内回。
一、抽屉原理
1.1 第一抽屉原理
原理1: 把
证明(反证法):如果每个抽屉至多只能放进一个物体,那么物体的总数至多是
原理2:把多于
证明(反证法):若每个抽屉至多放进
原理3:把无数多件物体放入
原理1 、2 、3都是第一抽屉原理的表述。
1.2 第二抽屉原理
把
二、集合
2.1 定义
把一些单独的物体(数、坐标、函数、集合)合起来看成一个整体,就形成一个集合(或集)
2.2 集合的特点
确定性、互异性、无序性
2.3 集合的表示
大写字母,如集合
2.4 属于与不属于
若
若
2.5 集合的表示
- 列举法
列举法就是将集合的元素逐一列举出来的方式。如 - 描述法
描述法的形式为{代表元素|满足的性质}。如所有满足大于 数的集合表示为 - 图像法
又称韦恩图法、韦氏图法,是一种利用二维平面上的点集表示集合的方法。如图: - 区间法
用数轴、无穷大、无穷小、开区间、闭区间 、半开半闭区间表示。
无穷大: ;无穷小: 。
开区间: 。闭区间: 。左闭右开: ,右闭左开: 。
开的那一边不包括数。如 不包括 。 - 符号法
:非负整数集合或自然数集合
或 :正整数集合
:整数集合
:有理数集合
:正有理数集合
:负有理数集合
:实数集合(包括有理数和无理数)
:正实数集合
:负实数集合
:复数集合
:空集(不含有任何元素的集合)
2.6 集合基本关系
- 子集与真子集
- 子集
设 是两个集合,如果 的所有元素都属于 ,则称 是 的子集,记为 (读作S包含于T)
一些显然性质: 。 - 真子集
若 且 有一个元素 满足 ,则称 是 的真子集。
- 子集
- 交集与并集
交集定义:由属于A且属于B的相同元素组成的集合,记作 (或 ),读作“A交B”(或“B交A”),即 。
并集定义:由所有属于集合A或属于集合B的元素所组成的集合,记作 (或 ),读作“A并B”(或“B并A”),即 。 - 相等集合
如果集合A是集合B的子集( ),且集合B是集合A的子集( ),则集合A与集合B相等。 - 补集
- 相对补集
由属于 而不属于 的元素组成的集合,称为B关于A的相对补集,记作 ,即 。 - 绝对补集
关于全集合 的相对补集称作 的绝对补集,记作 。
- 相对补集
- 幂集
设有集合 ,由集合 所有子集组成的集合,称为集合 的幂集。
对于幂集有定理如下:有限集 的幂集的基数等于 的有限集 的基数次幂。即若 的元素数量为 ,则幂集的元素数量为 。
三、一一对应
前置知识:映射
- 定义:两个非空集合
与 间存在着对应关系 ,而且对于 中的每一个元素 , 中总有唯一的一个元素 与它对应,就这种对应为从 到 的映射,记作 。其中, 称为元素 在映射 下的像,记作: 。 称为 关于映射 的原像。集合A中所有元素的像的集合称为映射 的值域,记作 。
一一对应:对于任意的
四、错排公式
错排问题(伯努利-欧拉的装错信封的问题):有
递推公式:
推导:
- 将元素
放到第 个位置,有 种办法。 - 若此时将元素
放到第 个位置,有 种方案数;若此时将元素 不放到第 个位置(此时 相当于 ),有 种方案数。 - 综上,
。
错排问题的通项公式见5.5。
五、容斥原理
5.1 引入
七(7)班中,有
显然有
5.2.1 经典容斥原理 - 1
经典例题:有集合
很容易想到
- 答案加上
,有:
- 显然多了
,减去即可。
5.2.2 经典容斥原理 - 2
经典例题:有集合
同“五-2”,答案为
5.3 容斥原理通项
例题:有集合
练习:出生点
5.4 二维前缀和
二维前缀和的本质是容斥原理
5.5 错排问题通项
正整数
提出一个
六、康拓展开
七、排列数与组合数
7.1 排列数
- 定义
从 个不同元素中,任取 个元素按照一定的顺序排成一列,叫做从 个不同元素中取出 个元素的一个排列;
从 个不同元素中取出 个元素的所有排列的个数,叫做从 个不同元素中取出 个元素的排列数,记作 。 - 计算
7.2 组合数
- 定义
从 个不同元素中,任取 个元素并成一组,叫做从 个不同元素中取出 个元素的一个组合;
从 个不同元素中取出 个元素的所有组合的个数,叫做从 个不同元素中取出 个元素的组合数,记作 。 - 计算
- 注明
有时写作
7.3 组合数性质
- 互补性
- 递推公式
推导过程:假设已知 ,那么对于 来说,要么多增加的那一个拿,要么不拿。故:
- 帕斯卡法则
推导过程:略。
7.4 计数方法
- 加法原理
一件事有 种 方法,每种方法有 种办法,这件事完成的方案数为 。 - 乘法原理
一件事有 步 要做,每一步拥有 种方法,这件事完成的方案数为 。
7.5 捆绑法、插空法
- 捆绑法用来处理相邻问题。在排列计数问题中,把需要相邻的元素“捆绑”在一起,视作一个元素参与排列。注意点:捆绑的元素最后还要“解绑”,把捆在一起的几个元素进行排列。
- 插空法用来处理不相邻问题。不能相邻的元素通常最后参与排列,通过插空的方式放在已排的元素之间。
7.6 隔板法
- 隔板法用来将相同的元素分组,并且每组至少有一个元素。
八、二项式定理
8.1 二项式定理
或表示为
8.2 二项式定理的简单推导
8.3 二项式定理的严谨推导
- 组合证法
设 满足:
对于
- 数学归纳法
易得 时,此时成立。
如果对于 时,二项式定理成立。
那么在 时,
所以对于
8.4 杨辉三角
杨辉三角:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ......
对于第
可以发现,对于任意的
所以杨辉三角又称作组合数表。
8.5 一些常用的式子
。 。
例题:Necklace
九、卡特兰数
9.1 卡特兰数的定义
- 卡特兰数的定义
对于在 位的 进制中,满足有 个 ,其余为 的数的个数。
前几个卡特兰数:
- 递推公式
定义 为卡特兰数第 项。则:
即
还可以写作:
- 通项公式
9.2 c++求卡特兰数
void catalan() //求卡特兰数 { int i, j, len, carry, temp; a[1][0] = b[1] = 1; len = 1; for(i = 2; i <= 100; i++) { for(j = 0; j < len; j++) //乘法 a[i][j] = a[i-1][j]*(4*(i-1)+2); carry = 0; for(j = 0; j < len; j++) //处理相乘结果 { temp = a[i][j] + carry; a[i][j] = temp % 10; carry = temp / 10; } while(carry) //进位处理 { a[i][len++] = carry % 10; carry /= 10; } carry = 0; for(j = len-1; j >= 0; j--) //除法 { temp = carry*10 + a[i][j]; a[i][j] = temp/(i+1); carry = temp%(i+1); } while(!a[i][len-1]) //高位零处理 len --; b[i] = len; } }
by 百度百科
9.3 卡特兰数的应用
十、欧拉筛
10.1 质数
- 只能被
和自己整除的数,称为质数 - 当
充分大时, ~ 范围内的质数个数约为 。 - 在某个正整数
附近找质数,能够在 期望时间内发现一个质数。 - 如何判断一个整数
是否为质数: 到 试除,发现约数则不是质数,复杂度 和 中至少有 个数不超过 ,完全平方数的情况 个数都等于 。
10.2 筛法(埃式筛)
- 从小到大,依次将每个质数的倍数删去(若遍历到一个数时,其没有被删去,则可知这个数是质数),最终留下的全是质数。
f[1]=false; for(int i=2;i<=n;i++) f[i]=true; for(int i=2;i<=n;i++) { if(f[i]==true) for(long long j=(long long)i*i;j<=n;j+=i) f[j]=false; }
从 开始是因为 、 等数字在 的时候已经被枚举过了。- 时间复杂度
。
10.3 筛法(欧拉筛)
- 数字
还是被筛了多次( )。如果能保证每个合数都只被它的最小质因数筛掉就好了。
比如 筛掉
比如 筛掉
比如 筛掉 - 我们记求解到
的质数数组为 ,则对于每个数字 ,我们希望 等数字都被筛掉。这样一定是能筛干净的,因为合数 某个质数 另一个数 ,我们一定能在枚举到每个合数前,枚举到比它小的 ,这样当 时, 就被干掉了。 - 每个合数还是没有只被它的最小质因数筛。
- 如
,被 干掉一次,被 干掉一次。
f[1]=false; for(int i=2;i<=n;i++) f[i]=true; for(int i=2;i<=n;i++) { if(f[i]==true) p[cnt++]=i; for(int j=1;j<=cnt&&i*p[j]<=n;j++) f[p[j]*i]=false; }
- 内层循环加上一句
if(i%p[j]==0)break;
即可。为什么? - 此时,比
p[j]
小的质数p[k]
不满足p[k]
,且 的所有质因数肯定都比p[j]
大,因为如果有小的那 早就被停在前面了。故被筛掉的p[k]
的最小质因数肯定是p[k]
。 - 同理可证,设有比
p[j]
大的质数p[l]
,则删p[l]
一定会出现重复,因为假设p[l]
p[j]
是 ,当 枚举到 时候,p[j]
又会把这个数字筛一次。 - 时间复杂度
。
f[1]=false; for(int i=2;i<=n;i++) f[i]=true; for(int i=2;i<=n;i++) { if(f[i]==true) p[cnt++]=i; for(int j=1;j<=cnt&&i*p[j]<=n;j++) { f[p[j]*i]=false; if(i%p[j]==0)break; } }
十一、逆元
11.1 逆元
若
则称
12.1 求逆元
- exGCD法
详见12.3 - 快速幂法
详见17.? - 线性求
逆元
证明详见 oi.wiki
inv[1] = 1; for (int i = 2; i <= n; ++i) { inv[i] = (long long)(p - p / i) * inv[p % i] % p; }
by oi-wiki
- 线性求
的逆元
详见12.4
十二、exGCD(扩展欧几里得)
12.0 不定方程
已知有多个个未知数,
不定方程组同理。
12.1 扩展欧几里得是什么?
关于
12.2 求解方程
- 代码实现
void exgcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1, y = 0; return ; } exgcd(b, a % b, y, x); y -= a / b * x; }
12.3 exGCD 求逆元
可以从
void exgcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1, y = 0; return ; } exgcd(b, a % b, y, x); y -= a / b * x; } int inv(int a, int p) { int x, y; exgcd(a, p, x, y); return x; }
12.4 exGCD求 的逆元
记
那么我们可以用exGCD求出
此时
则
12.5 exGCD求
设
那么
记
这个方程是可以解的。最终
十三、中国剩余定理
13.0 中国剩余定理的来源
「物不知数」问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:
三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。
13.1 线性同余方程组
给定
13.2 中国剩余定理(CRT)
记
则:
13.3 扩展中国剩余定理(exCRT)
如果
那什么是 exCRT 呢?
如果我们知道两个同余方程,将其合并成一个,这样就可以一个接着一个合并了。
见?
十四、裴蜀定理
方程
十五、数论分块
十六、同余与剩余系
十七、费马小定理
lhq:费马小
费马小定理:如果质数
- 另一个形式:对于任意整数
,
总所周知,费马小也是可以求逆元的。
本文作者:sLMxf
本文链接:https://www.cnblogs.com/SLMXF/p/18564553
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】