数论(自学)

零、说在前面

0.1 感谢

感谢百度百科、oi-wiki、洛谷的题目。

0.2 阅读前须知

作者很菜,不要看。如果有错误,私信即可,一周内回。

一、抽屉原理

1.1 第一抽屉原理

原理1: 把 n+kn+k 个物体放到 nn 个抽屉里,则至少有一个抽屉里的东西不少于两件。
证明(反证法):如果每个抽屉至多只能放进一个物体,那么物体的总数至多是 n×1n×1,而不是题设的 n+k(k≥1)n+k(k≥1),故不可能。
原理2:把多于 mn+1(n≠0)mn+1(n\ne 0) 个的物体放到 nn 个抽屉里,则至少有一个抽屉里有不少于 (m+1)(m+1)的物体。
证明(反证法):若每个抽屉至多放进 mm 个物体,那么 nn 个抽屉至多放进 mnmn 个物体,与题设不符,故不可能。
原理3:把无数多件物体放入 nn 个抽屉,则至少有一个抽屉里有无数个物体。
原理1 、2 、3都是第一抽屉原理的表述。

1.2 第二抽屉原理

把 (mn-1)(mn-1)个物体放入 nn 个抽屉中,其中必有一个抽屉中至多有 (m−1)(m-1) 个物体。

例题:天选之人(?)、取模

二、集合

2.1 定义

把一些单独的物体(数、坐标、函数、集合)合起来看成一个整体,就形成一个集合(或集)

2.2 集合的特点

确定性、互异性、无序性

2.3 集合的表示

大写字母,如集合 A,B,XA,B,X。

2.4 属于与不属于

若 aa 属于集合 AA,记做 a∈Aa\in A。
若 aa 不属于集合 AA,记做 a∉Aa\not \in A。

2.5 集合的表示

  • 列举法
    列举法就是将集合的元素逐一列举出来的方式。如 {1,14,51,4},{∅,{1,14,51,4},{(1,1),(2,2)},1.14}\{1,14,51,4\},\{\varnothing,\{1,14,51,4\},\{(1,1),(2,2)\},1.14\}
  • 描述法
    描述法的形式为{代表元素|满足的性质}。如所有满足大于 114114 数的集合表示为 {x∣x>114}\{x|x>114\}
  • 图像法
    又称韦恩图法、韦氏图法,是一种利用二维平面上的点集表示集合的方法。如图:
  • 区间法
    用数轴、无穷大、无穷小、开区间、闭区间 、半开半闭区间表示。
    无穷大:+∞+\infty;无穷小:−∞-\infty。
    开区间:(a,b)(a,b)。闭区间:[a,b][a,b]。左闭右开:[a,b)[a,b),右闭左开:(a,b](a,b]。
    开的那一边不包括数。如 (114,514)(114,514) 不包括 114,514114,514。
  • 符号法
    NN:非负整数集合或自然数集合 {0,1,2,3,…}\{0,1,2,3,…\}
    N∗N^* 或 N+N^+:正整数集合 {1,2,3,…}\{1,2,3,…\}
    ZZ:整数集合 {…,−1,0,1,…}\{…,-1,0,1,…\}
    QQ:有理数集合
    Q+Q+:正有理数集合
    Q−Q-:负有理数集合
    RR:实数集合(包括有理数和无理数)
    R+R+:正实数集合
    R−R-:负实数集合
    CC:复数集合
    ∅\varnothing :空集(不含有任何元素的集合)

2.6 集合基本关系

  • 子集与真子集
    • 子集
      设 S,TS,T 是两个集合,如果 SS 的所有元素都属于 TT ,则称 SS 是 TT 的子集,记为 S⊆TS\subseteq T (读作S包含于T)
      一些显然性质:S⊆S,∅⊆SS\subseteq S,\varnothing \subseteq S。
    • 真子集
      若 S⊆TS\subseteq T 且 TT 有一个元素 xx 满足 x∉Sx\not \in S,则称 SS 是 TT 的真子集。
  • 交集与并集
    交集定义:由属于A且属于B的相同元素组成的集合,记作A⋂BA\bigcap B(或 B⋂AB\bigcap A ),读作“A交B”(或“B交A”),即A⋂B={x∣x∈A,且x∈B}A\bigcap B=\{x|x∈A,\texttt且x∈B\}。

    并集定义:由所有属于集合A或属于集合B的元素所组成的集合,记作 A⋃BA\bigcup B(或 B⋃AB\bigcup A),读作“A并B”(或“B并A”),即 A⋃B={x∣x∈A,或x∈B}A\bigcup B=\{x|x∈A,\texttt或x∈B\}。
  • 相等集合
    如果集合A是集合B的子集(A⊆BA\subseteq B),且集合B是集合A的子集(B⊆AB\subseteq A),则集合A与集合B相等。
  • 补集
    • 相对补集
      由属于 AA 而不属于 BB 的元素组成的集合,称为B关于A的相对补集,记作 ∁AB\complement_{A}B ,即 ∁AB={x∣x∈A,且x∉B}\complement_{A}B=\{x|x∈A,\texttt且x∉B\}。
    • 绝对补集
      AA 关于全集合 UU 的相对补集称作 AA 的绝对补集,记作 ∁UA\complement_{U}A。
  • 幂集
    设有集合 AA,由集合 AA 所有子集组成的集合,称为集合 AA 的幂集。
    对于幂集有定理如下:有限集 AA 的幂集的基数等于 22 的有限集 AA 的基数次幂。即若 AA 的元素数量为 xx,则幂集的元素数量为 2x2^x。

三、一一对应

前置知识:映射

  • 定义:两个非空集合 AA 与 BB 间存在着对应关系 ff,而且对于 AA 中的每一个元素 aa,BB 中总有唯一的一个元素 bb 与它对应,就这种对应为从 AA 到 BB 的映射,记作 f:A→Bf:A→B。其中,bb 称为元素 aa 在映射 ff 下的像,记作:b=f(a)b=f(a)。aa 称为 bb 关于映射 ff 的原像。集合A中所有元素的像的集合称为映射 ff 的值域,记作 f(A)f(A)。

一一对应:对于任意的 f:A→Bf:A\to B,有 BB 的任何元素都不能与 AA 的多个元素配对。

四、错排公式

错排问题(伯努利-欧拉的装错信封的问题):有 nn 封信,nn 个邮箱,第 ii 封信对应第 ii 个邮箱。问所有信都投错的方案数是多少?

递推公式:Tn=(n−1)(Tn−1+Tn−2)T_n=(n-1)(T_{n-1}+T_{n-2})。

推导:

  1. 将元素 nn 放到第 k(k≠n)k(k\ne n) 个位置,有 n−1n-1 种办法。
  2. 若此时将元素 kk 放到第 nn 个位置,有 (n−1)Tn−2(n-1)T_{n-2} 种方案数;若此时将元素 kk 不放到第 nn 个位置(此时 kk 相当于 nn),有 (n−1)Tn−1(n-1)T_{n-1} 种方案数。
  3. 综上,Tn=(n−1)(Tn−1+Tn−2)T_n=(n-1)(T_{n-1}+T_{n-2})。

错排问题的通项公式见5.5。

五、容斥原理

5.1 引入

七(7)班中,有 nn 人玩原神,mm 人玩MC,k(k≤n且k≤m)k(k\le n \texttt且 k\le m) 人两款游戏都玩,全班至少玩这两款游戏之一,问全班多少人?
显然有 n+m−kn+m-k 人。

5.2.1 经典容斥原理 - 1

经典例题:有集合 A,BA,B,求其并集大小。
很容易想到 ∣A⋃B∣=∣A∣+∣B∣−∣A⋂B∣|A\bigcup B|=|A|+|B|-|A\bigcap B|。原理如下:

  1. 答案加上 ∣A∣+∣B∣|A|+|B|,有:
  2. 显然多了 ∣A⋂B∣|A\bigcap B|,减去即可。

5.2.2 经典容斥原理 - 2

经典例题:有集合 A,B,CA,B,C,求其并集大小。
同“五-2”,答案为 ∣A⋃B⋃C∣=∣A∣+∣B∣+∣C∣−∣A⋂B∣−∣A⋂C∣−∣B⋂C∣+∣A⋂B⋂C∣|A\bigcup B\bigcup C|=|A|+|B|+|C|-|A\bigcap B|-|A\bigcap C|-|B\bigcap C|+|A\bigcap B\bigcap C|。

5.3 容斥原理通项

例题:有集合 A1∼AnA_1\sim A_n,求其并集大小。

∣A1⋃A2⋃⋯⋃An∣=∑1≤i≤n∣Ai∣−∑1≤i≤j≤n∣Ai⋂Aj∣+∑1≤i≤j≤k≤n∣Ai⋂Aj⋂Ak∣−⋯+(−1)n∣A1⋂A2⋂⋯⋂An∣=∑k=1n(−1)k+1∑1≤i1≤i2≤⋯≤ik∣Ai1⋂Ai2⋂⋯⋂Ain∣\begin{aligned} \left|A_1\bigcup A_2 \bigcup\cdots\bigcup A_n\right|&=\sum\limits_{1\le i\le n} \left|A_i\right|-\sum\limits_{1\le i\le j\le n} \left|A_i\bigcap A_j\right|+\sum\limits_{1\le i\le j\le k\le n} \left|A_i\bigcap A_j\bigcap A_k\right|-\cdots+(-1)^n \left|A_1\bigcap A_2\bigcap \cdots\bigcap A_n\right|\\ &=\sum\limits^{n}_{k=1}(-1)^{k+1}\sum\limits_{1\le i_1\le i_2\le \cdots\le i_k}\left|A_{i_1}\bigcap A_{i_2}\bigcap\cdots\bigcap A_{i_n}\right| \end{aligned}

练习:出生点

5.4 二维前缀和

二维前缀和的本质是容斥原理

si,j=si,j−1+si−1,j−si−1,j−1+ai,js_{i,j}=s_{i,j-1}+s_{i-1,j}-s_{i-1,j-1}+a_{i,j} ∑i=xbxe∑j=ybyeai,j=sxe,ye+sxb−1,yb−1−sxb−1,ye−sxe,yb−1\sum_{i = xb}^{xe} \sum_{j = yb}^{ye}a_{i,j}=s_{xe,ye}+s_{xb-1,yb-1}-s_{xb-1,ye}-s_{xe,yb-1}

5.5 错排问题通项

正整数 1,2,3,⋯ ,n1,2,3,\cdots,n 的全排列有 n!n! 种,其中第 kk 位是 kk 的排列有 (n−1)!(n-1)! 种,由于所求的是错排的种数,所以应当减去这些排列;但是此时把同时有两个点放对位置的排列多排除了一次,应补上;在补上时,把同时有三个数不错排的排列多补上了一次,应排除;……;继续这一过程,得到错排的排列种数为

Tn=n!+n!1!−n!2!+⋯+(−1)nn!n!=∑i=2n(−1)i×n!i!T_n=n!+\dfrac{n!}{1!}-\dfrac{n!}{2!}+\cdots+(-1)^n\dfrac{n!}{n!}=\sum\limits^n_{i=2}\dfrac{(-1)^i\times n!}{i!}

提出一个 n!n!,有 Tn=n!∑i=2n(−1)ii!T_n=n!\sum\limits^n_{i=2}\dfrac{(-1)^i}{i!}

六、康拓展开

七、排列数与组合数

7.1 排列数

  • 定义
    从 nn 个不同元素中,任取 m(m≤n)m(m≤n) 个元素按照一定的顺序排成一列,叫做从 nn 个不同元素中取出 mm 个元素的一个排列;
    从 nn 个不同元素中取出 m(m≤n)m(m≤n) 个元素的所有排列的个数,叫做从 nn 个不同元素中取出 mm 个元素的排列数,记作 AnmA^m_n。
  • 计算
Anm=n×(n−1)×(n−2)×⋯×(n−m+1)=n!(n−m)!\begin{aligned} A^m_n&=n\times (n-1)\times (n-2)\times \cdots\times (n-m+1)\\ &=\dfrac{n!}{(n-m)!} \end{aligned}

7.2 组合数

  • 定义
    从 nn 个不同元素中,任取 m(m≤n)m(m≤n) 个元素并成一组,叫做从 nn 个不同元素中取出 mm 个元素的一个组合;
    从 nn 个不同元素中取出 m(m≤n)m(m≤n) 个元素的所有组合的个数,叫做从 nn 个不同元素中取出 mm 个元素的组合数,记作 CnmC^m_n。
  • 计算
Cnm=AnmAmm=n!(n−m)!×m!\begin{aligned} C^m_n&=\dfrac{A^m_n}{A_m^m}\\ &=\dfrac{n!}{(n-m)!\times m!} \end{aligned}
  • 注明
    CnmC_n^m 有时写作 (nm)\begin{pmatrix} n\\m \end{pmatrix}

7.3 组合数性质

  • 互补性
Cnm=Cnn−mC^m_n=C^{n-m}_n
  • 递推公式
    推导过程:假设已知 Cn−1kC^{k}_{n-1},那么对于 CnmC^m_n 来说,要么多增加的那一个拿,要么不拿。故:
Cnm=Cn−1m+Cn−1m−1C^m_n=C^m_{n-1}+C^{m-1}_{n-1}
  • 帕斯卡法则
    推导过程:略。
Ckn−1+Ck−1n−1=CknC^{n-1}_{k}+C^{n-1}_{k-1}=C^n_k

7.4 计数方法

  • 加法原理
    一件事有 nn 种 方法,每种方法有 aia_i 种办法,这件事完成的方案数为 ∑ai\sum a_i。
  • 乘法原理
    一件事有 nn 步 要做,每一步拥有 aia_i 种方法,这件事完成的方案数为 ∏ai\prod a_i。

7.5 捆绑法、插空法

  • 捆绑法用来处理相邻问题。在排列计数问题中,把需要相邻的元素“捆绑”在一起,视作一个元素参与排列。注意点:捆绑的元素最后还要“解绑”,把捆在一起的几个元素进行排列。
  • 插空法用来处理不相邻问题。不能相邻的元素通常最后参与排列,通过插空的方式放在已排的元素之间。

7.6 隔板法

  • 隔板法用来将相同的元素分组,并且每组至少有一个元素。

八、二项式定理

8.1 二项式定理

(x+y)n=∑i=0n(Cni×xi×yn−i)(x+y)^n=\sum\limits_{i=\color{red}0}^n(C_n^i\times x^i\times y^{n-i})

或表示为

(x+y)n=[x0⋯xn][Cn0⋱Cnn][1⋯1][b0⋮bn](x+y)^n=[x^0\hspace{0.3cm}\cdots\hspace{0.3cm}x^n]\begin{bmatrix} C^0_n & & \\ & \ddots & \\& & C^n_n \end{bmatrix}\begin{bmatrix} & & 1\\ & \cdots & \\1 & & \end{bmatrix}\begin{bmatrix} b^0\\ \vdots \\b^n \end{bmatrix}

8.2 二项式定理的简单推导

(x+y)1=x+y(x+y)^1=x+y (x+y)2=x2+2xy+y2(x+y)^2=x^2+2xy+y^2 (x+y)3=x3+3x2y+3xy2+y2(x+y)^3=x^3+3x^2y+3xy^2+y^2 ⋯\cdots (x+y)n=∑i=0n(Cnixiyn−i)(x+y)^n=\sum\limits_{i=0}^n(C_n^ix^iy^{n-i})

8.3 二项式定理的严谨推导

  • 组合证法
    设 a1∼ana_1\sim a_n 满足:
(x+y)n=(x+y)×(x+y)×(x+y)×(x+y)×⋯×(x+y)⏟n个(x+y)=a1xn+a2xn−1y+a3xn−2y2+⋯+anyn\begin{aligned}(x+y)^n&=\underbrace{(x+y)\times (x+y)\times (x+y)\times (x+y)\times\cdots \times (x+y)}_{n\texttt{个}(x+y)}\\ &=a_1x^n+a_2x^{n-1}y+a_3x^{n-2}y^2+\cdots+a_ny^n \end{aligned}

对于 ii 项,如果要求出 aia_i 那么就在这 nn 个 (x+y)(x+y) 组合\color{red}\texttt{组合}。由于需要选出 ii 个 xx 出来,所以 ai=Cnia_i=C_n^i。

  • 数学归纳法
    易得 m=1m=1 时,此时成立。
    如果对于 m=nm=n 时,二项式定理成立。
    那么在 m=n+1m=n+1 时,
(x+y)n+1=x(x+y)n+y(x+y)n=x∑i=0n(Cnixiyn−i)+y∑i=0n(Cnixiyn−i)=∑i=0n(Cnixi+1yn−i)+∑i=0n(Cnixiyn−i+1)=∑i=0n(Cnixi+1yn−i)+∑i=1n(Cnixiyn−i+1)+yn+1=∑i=1n+1(Cni−1xiyn−i+1)+∑i=1n(Cnixiyn−i+1)+yn+1=xn+1+yn+1+∑i=1n(Cni−1xiyn−i+1)+∑i=1n(Cnixiyn−i+1)=xn+1+yn+1+∑i=1n(Cni−1+Cni)(xiyn−i+1)=xn+1+yn+1+∑i=1n(Cn+1ixiyx−i+1)(帕斯卡法则)=∑i=0m(Cmixiym−i)\begin{aligned}(x+y)^{n+1}&=x(x+y)^n+y(x+y)^n\\ &=x\sum\limits_{i=0}^n(C_n^ix^iy^{n-i})+y\sum\limits_{i=0}^n(C_n^ix^iy^{n-i})\\ &=\sum\limits_{i=0}^n(C_n^ix^{i+1}y^{n-i})+\sum\limits_{i=0}^n(C_n^ix^iy^{n-i+1})\\ &=\sum\limits_{i=0}^n(C_n^ix^{i+1}y^{n-i})+\sum\limits_{i=1}^n(C_n^ix^iy^{n-i+1})+y^{n+1}\\ &=\sum\limits_{i=1}^{n+1}(C_{n}^{i-1}x^{i}y^{n-i+1})+\sum\limits_{i=1}^n(C_n^ix^iy^{n-i+1})+y^{n+1}\\ &=x^{n+1}+y^{n+1}+\sum\limits_{i=1}^{n}(C_{n}^{i-1}x^{i}y^{n-i+1})+\sum\limits_{i=1}^n(C_n^ix^iy^{n-i+1})\\ &=x^{n+1}+y^{n+1}+\sum\limits^n_{i=1}(C^{i-1}_n+C^{i}_n)(x^iy^{n-i+1})\\ &=x^{n+1}+y^{n+1}+\sum\limits^n_{i=1}(C^i_{n+1}x^iy^{x-i+1}){\texttt{\color{red}(帕斯卡法则)}}\\ &=\sum\limits_{i=0}^m(C_m^ix^iy^{m-i}) \end{aligned}

所以对于 n∈N+n\in N^+,有 (x+y)n=∑i=0n(Cnixiyn−i)(x+y)^n=\sum\limits_{i=0}^n(C_n^ix^iy^{n-i})。

8.4 杨辉三角

杨辉三角:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
......

对于第 ii 行第 jj 个数,有 y(i,j)=y(i−1,j−1)+y(i−1,j),y(i,1)=y(i,i)=1y(i,j)=y(i-1,j-1)+y(i-1,j),y(i,1)=y(i,i)=1。
可以发现,对于任意的 y(i,j)y(i,j),值为 CijC_i^j。
所以杨辉三角又称作组合数表。

8.5 一些常用的式子

  • ∑Cni=2n\sum C_n^i=2^n。
  • ∑Cniai=(a+1)n\sum C_n^ia^i=(a+1)^n。
  • ∑(Cni)2=C2nn\sum (C_n^i)^2=C_{2n}^n

例题:Necklace

九、卡特兰数

9.1 卡特兰数的定义

  • 卡特兰数的定义
    对于在 nn 位的 22 进制中,满足有 mm 个 00,其余为 11 的数的个数。
    前几个卡特兰数:
1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790,477638700,1767263190,6564120420,24466267020,91482563640,343059613650,1289904147324,4861946401452,...1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
  • 递推公式
    定义 h(i)h(i) 为卡特兰数第 ii 项。则:
h(n+1)=h(n)h(0)+h(n−1)h(1)+⋯+h(0)(n)h(n+1)=h(n)h(0)+h(n-1)h(1)+\cdots+h(0)(n)

即

h(n)=∑i=0n−1h(i)h(n−i)h(n)=\sum\limits^{n-1}_{i=0}h(i)h(n-i)

还可以写作:

h(n)=h(n−1)(4n−2)n+1h(n)=\dfrac{h(n-1)(4n-2)}{n+1}
  • 通项公式
h(n)=C2nnn+1(n∈N)h(n)=\dfrac{C_{2n}^n}{n+1}\hspace{0.5cm}(n\in N) h(n)=C2nn−C2nn−1h(n)=C^n_{2n}-C^{n-1}_{2n}

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 质数

  • 只能被 11 和自己整除的数,称为质数
  • 当 NN 充分大时,11 ~ NN 范围内的质数个数约为 Nlog⁡N\dfrac{N}{\log N}。
  • 在某个正整数 NN 附近找质数,能够在 log⁡N\log N 期望时间内发现一个质数。
  • 如何判断一个整数 nn 是否为质数:22 到 n\sqrt{n} 试除,发现约数则不是质数,复杂度 O(n)O(\sqrt{n})
  • aa 和 na\dfrac{n}{a} 中至少有 11 个数不超过 n\sqrt{n},完全平方数的情况 22 个数都等于 n\sqrt{n}。

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;
}
  • jj 从 i×ii\times i 开始是因为 2×i2\times i、3×i3\times i 等数字在 i=2,i=3i=2,i=3 的时候已经被枚举过了。
  • 时间复杂度 O(nlog⁡log⁡n)O(n\log\log n)。

10.3 筛法(欧拉筛)

  • 数字 3030 还是被筛了多次(3×10、2×15、5×63\times 10、2\times15、5\times 6)。如果能保证每个合数都只被它的最小质因数筛掉就好了。
    比如 22 筛掉 4、6、8、10、12⋯4、6、8、10、12\cdots
    比如 33 筛掉 9、15、21⋯9、15、21\cdots
    比如 55 筛掉 25、35、55⋯25、35、55\cdots
  • 我们记求解到 ii 的质数数组为 pp,则对于每个数字 ii,我们希望 i×p1、i×p2i\times p_1、i\times p_2 等数字都被筛掉。这样一定是能筛干净的,因为合数 a=a= 某个质数 b×b\times 另一个数 cc,我们一定能在枚举到每个合数前,枚举到比它小的 cc,这样当 pj=bp_j=b 时,aa 就被干掉了。
  • 每个合数还是没有只被它的最小质因数筛。
  • 如 6060,被 3×203\times 20干掉一次,被 15×415\times 4干掉一次。
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] ∣i|i,且 ii 的所有质因数肯定都比 p[j] 大,因为如果有小的那 jj 早就被停在前面了。故被筛掉的 i×i\times p[k] 的最小质因数肯定是 p[k]。
  • 同理可证,设有比 p[j] 大的质数 p[l] ,则删 p[l] ×i\times i 一定会出现重复,因为假设 p[l] ×i/\times i / p[j] 是 xx,当 ii 枚举到 xx 时候,x×x\times p[j] 又会把这个数字筛一次。
  • 时间复杂度 O(n)O(n)。
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 逆元

若 a,x,pa,x,p 满足式子:

ax≡1(modp)ax\equiv 1 \pmod p

则称 xx 是模 pp 意义下 aa 的逆元。记作 x=a−1x=a^{-1}。

12.1 求逆元

  • exGCD法
    详见12.3
  • 快速幂法
    详见17.?
  • 线性求 1∼n1\sim n 逆元
    证明详见 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

  • 线性求 a1∼ana_1\sim a_n 的逆元
    详见12.4

十二、exGCD(扩展欧几里得)

12.0 不定方程

已知有多个个未知数,11 个方程,我们称其为不定方程。

不定方程组同理。

12.1 扩展欧几里得是什么?

关于 x,yx,y 的不定方程的一组解:

ax+by=gcd⁡(a,b)ax+by=\gcd(a,b)

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 求逆元

可以从 ax≡x(modp)ax \equiv x\pmod{p} 这个式子入手。很容易发现,它和 ∃y,ax+py=1\exists y,ax+py=1 等价。( ∃\exists 表示存在)而这个式子就是一个关于 a,pa,p 的不定方程,就可以用扩展欧几里得算法来解决。并由裴蜀定理,可以发现 aa 在模 pp 意义下逆元当且仅当 gcd⁡(a,p)=1\gcd(a,p)=1 , aa 和 pp 互质,即 a⊥pa\perp p。

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求 a1∼ana_1\sim a_n 的逆元

记 pi=∏j=1iajp_i=\prod\limits _{j=1}^{i} a_j。

那么我们可以用exGCD求出 pi−1{p_i}^{-1},记作 viv_i。

此时 vi×an=(∏i=1n−1ai)−1v_i\times a_n={ \begin{pmatrix} \prod\limits_{i=1}^{n-1}a_i \end{pmatrix}} ^{-1},记作 vi−1v_{i-1},同理,可以求出 v1∼vnv_1\sim v_n。

则 ai−1=vi×pi−1{a_i}^{-1}=v_i\times p_{i-1}

12.5 exGCD求 ab mod p\dfrac{a}{b}\bmod p

设 ab≡x(modp)\dfrac{a}{b}\equiv x\pmod p

那么 a≡bx(modp)a\equiv bx\pmod p

记 x′=xax'=\dfrac{x}{a},那么 bx′≡1(modp)bx'\equiv 1\pmod p。

这个方程是可以解的。最终 x=ax′x=ax'。

十三、中国剩余定理

13.0 中国剩余定理的来源

「物不知数」问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:

三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。

13.1 线性同余方程组

给定 nn 个线性同余方程:

{x≡a1(modm1)x≡a2(modm2)⋯x≡an(modmn)\begin{cases}x\equiv a_1\pmod {m_1}\\x\equiv a_2\pmod {m_2}\\\cdots\\x\equiv a_n\pmod {m_n}\end{cases}

mim_i 两两互质,求 xx 的通解。

13.2 中国剩余定理(CRT)

记 M=∏miM=\prod m_i,Mi=MmiM_i=\dfrac{M}{m_i},tit_i 是在 MiM_i 在模 mim_i 意义下的逆元。

则:

x=kM+∑i=1naitiMix=kM+\sum_{i=1}^{n} a_it_iM_i

13.3 扩展中国剩余定理(exCRT)

如果 mim_i 两两不互质,那么就不能使用 CRT 了。

那什么是 exCRT 呢?

如果我们知道两个同余方程,将其合并成一个,这样就可以一个接着一个合并了。

见?

十四、裴蜀定理

方程 ax+by=cax+by=c 有解当且仅当 gcd⁡(a,b)∣c\gcd(a,b)|c。

十五、数论分块

十六、同余与剩余系

十七、费马小定理

lhq:费马小

费马小定理:如果质数 pp 满足 a⊥pa\bot p,则 ap−1≡1(modp)a^{p-1}\equiv 1\pmod p

  • 另一个形式:对于任意整数 aa,ap≡a(modp)a^p\equiv a\pmod p

总所周知,费马小也是可以求逆元的。

posted @ 2024-06-29 14:52  sLMxf  阅读(109)  评论(0)    收藏  举报  来源