浅谈 CSP 数学知识点

· · 算法·理论

浅谈 CSP 数学知识点

本篇文章耗时 5 天完成,希望对初赛有所帮助。若知识点前无标明 S组,则为必会知识。当然,这只是简化版。

板块一:数论基础

1、质数与合数

概念

判定方法——试除法

检查从 2\sqrt n 的所有质数,若都不能整除 n,则 n 是质数。

这里便衍生出了通过代码判断质数的埃式筛线性筛,这里不过多赘述(可以看这篇文章)

2、最大公约数(GCD)和最小公倍数(LCM)

概念

公式

\gcd(a,b) \times \operatorname{lcm}(a,b) = a \times b​

求法——辗转相除法

也叫欧几里得算法

反复用较大数除以较小数取余,直到余数为 0,最后的除数就是最大公约数。

当然,在代码中,求 ab 的最大公约数时可以用函数 __\gcd(a,b)。注意前面有两个下划线

3、分解质因数

概念

把一个合数写成几个质数相乘的形式。

方法——短除法

从最小质数 2 开始试除,直到完全分解。

例题:分解 84

所以,$84 = 2^2 \times 3 \times 7

4、整除

概念

a 是非零整数,b 是整数。如果存在一个整数 q,使得 b=a\times q,那么就可以说 b 可被 a 整除,记作 a \mid b

性质

证明:因为 a\mid nb\mid n。根据性质 3 可得:(a\times b)\mid(b\times n)(a\times b) \mid (a \times n)

再由性质 2 可得:(a\times b) \mid (a\times n \times x+b\times n \times y)。其中:a\times n\times x+b\times n\times y=n(ax+by)=n。综上:(a \times b)\mid n

5、同余和模运算

概念

#### 模运算的性质 - $ (a+b) \bmod m = (a \bmod m + b \bmod m) \bmod m

相关定理

p 为质数,则 p \mid (p-1)!+1,即:(p-1)! \equiv -1 \pmod p。当然,其逆定理也成立。

p 为质数,a 为正整数,\gcd(a,p)=1,则 a^{p-1} \equiv 1 \pmod p

\gcd(a,m)=1,则 a^{\varphi(m)} \equiv 1 \pmod m。(\varphi(n)1n 中与 n 互质的数的个数,详细见后文)

a^b \equiv \begin{cases} a^{b \bmod \varphi(p)}, \quad \quad \quad \quad \gcd(a,p) = 1\\ a^b, \quad \quad \quad \quad \quad \quad \quad \gcd(a,p) \neq 1,b<\varphi(p) \pmod p\\ a^{(b \bmod \varphi(p))+\varphi(p)}, \quad \gcd(a,p) \neq 1,b \geq\varphi(p) \end{cases}

例题:计算 123 \times 456  \bmod  7

123 \bmod 7 = 4$,$456 \bmod 7 = 1 #### 用途 在一些题目中会要求取模,这时,应该一边加(或乘)一边取模,防止溢出。 ### 6、快速幂 #### 用途 快速计算 $a^b \bmod m$,时间复杂度 $O(\log b)$。 #### 原理 将指数 $b$ 写成二进制形式,边平方边乘。 #### 模板:[P1226 【模板】快速幂 - 洛谷](https://www.luogu.com.cn/problem/P1226) ```cpp int power(int x,int p,int mod){ int y = 1; while (p){ if (p & 1) y = (x * y) % mod; x = (x * x) % mod; p >>= 1; } return y % mod; } ``` ### 7、欧拉函数 $\varphi

概念

#### 公式 若 $n=p_1^{k_1} \times p_2^{k_2} \times \dots$,则 $$ \varphi(n) = n \times (1 - \frac{1}{p_1}) \times (1 - \frac{1}{p_2}) \times \dots (p 为质数) $$ #### 例题:求 $1$ 到 $10$ 中与 $10$ **互质**的数的个数。 $10 = 2 \times 5

所以, \varphi(10) = 10 \times (1-\frac{1}{2}) \times (1-\frac{1}{5})=10 \times 0.5 \times 0.8=4

8、扩展欧几里得 Exgcd (S 组)

用途

求方程 ax+by=\gcd(a,b) 的一组整数解。

原理

欧几里得算法(辗转相除法)相似的,已知 \gcd(a,b) = \gcd(b,a \bmod b),因此原方程等价于 bx+(a \bmod b)y=\gcd(b,a \bmod b) ,所以我们可以先解这个方程。

9、裴蜀定理 (S组)

基础定理

如果 ab 均为整数,则有整数 xy 使 ax+by=\gcd(a,b)

换言之,若 ax+by=c 有解,则 c = k \times \gcd(a,b)。(用扩展欧几里得定理可证明)

推论

推论 1(逆命题):ax+by=1 有整数解时,当且仅当 \gcd(a,b)=1,即 ab 互质。
推论 2:对于 n 个整数 a_1,a_2,\dots,a_n,存在整数 x_1,x_2,\dots,x_n 使得 a_1x_1+a_2x_2+\dots+a_nx_n=\gcd(a_1,a_2,\dots,a_n)

模逆元

定义:对于整数 a 和模数 m,如果存在整数 x 使得 a \times x \equiv 1 \pmod m,那么 x 就叫做 a 在模 m 下的逆元,记作 a^{-1} \pmod m

条件(重点):a 在模 m 下存在逆元当且仅当 \gcd(a,m)=1,即 am 互质。

证明:

10、中国剩余定理 (S组)

概念

m_1,m_2,\dots,m_k两两互质的正整数,对于任意整数 a_1,a_2,\dots,a_k,同余方程式:

\begin{cases} x \equiv a_1 \pmod {m_1} \\ x \equiv a_2 \pmod {m_2} \\ \vdots \\ x \equiv a_k \pmod {m_k} \end{cases}

一定有整数解,并且在模 M=m_1m_2\dots m_k解唯一

这里的”解唯一“的意思是:如果 xx′ 都为原方程的解,则 x \equiv x′ \pmod M

求解方法——构造法

设:

因为 M_im_i 互质,所以 M_i 在模 m_i 下有逆元 t_i,满足 M_it_i \equiv 1 \pmod {m_i} (求 t_i

然后可以构造:

x = a_1M_1t_1+a_2M_2t_2+\dots+a_kM_kt_k

(证明方法:将 x 代入每个方程式可以证明都成立)

最后,解为 x \bmod M

例题

求解:\begin{cases} x \equiv 2 \pmod {3} \\ x \equiv 3 \pmod {5} \\ x \equiv 2 \pmod {7} \end{cases}

解:M = 3 \times 5 \times 7 = 105

所以,x=2 \times 35 \times 2+3 \times 21 \times 1+2 \times15 \times 1=233

即,解为 x=233 \bmod 105=23

扩展:模数不互质

方法:把两个同余方程合并成一个,减少方程数量,直到只剩一个。

原因:设任意整数 k,第一个方程 x=a+mk,代入方程 2,得 a+mk \equiv b \pmod n,即:mk \equiv b-a \pmod n,这个一次同余方程有解等价于 \gcd(m,n) \mid (b-a),即:b-a \equiv 0 \pmod {\gcd(m,n)} \Leftrightarrow a \equiv b \pmod {\gcd(m,n)}

例题 1:P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪 - 洛谷

#include <bits/stdc++.h>
#define int __int128
#define N 15
using namespace std;

long long n;
long long a[N],b[N];
int m[N];
int M;
int ans;
int x,y;

void exgcd(int u,int v){
    if (v == 0){
        x = 1;
        y = 0;
        return;
    }

    exgcd(v,u%v);
    int temp = x;
    x = y;
    y = temp - y*(u/v);
}

signed main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i=1;i<=n;++i) cin >> a[i] >> b[i];

    M = 1;
    for (int i=1;i<=n;++i) M *= a[i];
    for (int i=1;i<=n;++i) m[i] = M / a[i];

    for (int i=1;i<=n;++i){
        exgcd(m[i],a[i]);
        x = (x + a[i]) % a[i]; //先求最小解!!!
        ans = (ans + b[i] * m[i] * x + M) % M;
    }
    cout << (long long)ans;

    return 0;
}

例题 2:P4777 【模板】扩展中国剩余定理(EXCRT) - 洛谷

#include <bits/stdc++.h>
#define int __int128
#define N 100005
using namespace std;

long long n;
long long a[N],b[N];
int x,y;
int A,B;
int t;

void exgcd(int u,int v){
    if (v == 0){
        x = 1;
        y = 0;
        t = u;
        return;
    }
    exgcd(v,u%v);
    int temp = x;
    x = y;
    y = temp - y * (u/v);
}

signed main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n;
    A = 1;
    for (int i=1;i<=n;++i) cin >> a[i] >> b[i];
    for (int i=1;i<=n;++i){
        exgcd(A,a[i]);
        x = (B - b[i]) / t * x;
        B = B - A * x;
        A = a[i] / t * A;
        B = (B+A)%A;
    }
    cout << (long long)((B+A)%A);


    return 0;
}

11、斐波那契数列

定义

F_0 = 0$,$F_1 = 1$,$F_i=F_{i-1}+F_{i-2}

性质

(1)卡西尼性质:F_{n-1}F_{n+1}-F^2_n=(-1)^n

(2)附加性质:F_{n+k}=F_kF_{n+1}+F_{k-1}F_n

(3)在上一性质中,当 k=n 时,F_{2n}=F_n(F_{n+1}+F_{n-1})

(4)由上一性质可以归纳证明:\forall k \in \N,F_n \mid F_{nk}

(5)上一条性质可逆,即: \forall F_a \mid F_b,a \mid b

(6)\gcd 性质:\gcd(F_m,F_n)=F_{\gcd(m,n)}

(7)F_0+F_1+F_2+\dots+F_n=F_{n+2}-1F_1+F_3+F_5+\dots+F_{2n-1}=F_{2n}F_0+F_2+F_4+\dots+F_2n=F_{2n+1}-1

(8)F_0F_1+F_1F_2+\dots+F_{2n-1}F_{2n}=F^2_{2n}

(9)F^2_{n-1}+F^2_n=F_{2n-1}F^2_{n+1}-F^2_{n-1}=F_{2n}

通项公式

F_n=\frac{(\frac{1+\sqrt5}{2})^n-(\frac{1-\sqrt5}{2})^n}{\sqrt{5}}

板块二:计数原理

1、集合基本概念

规律:含 n 个元素的集合有 2n 个子集2n−1 个非空子集,2n−1 个真子集2n−2 个非空真子集

2、集合的基本运算

运算 符号 含义 记法
并集 \cup 属于 A 属于 B A \cup B = \{x \in A \wedge x \in B\}
交集 \cap 同时属于 AB A \cap B = \{x \in A \vee x \in B\}
补集 \overline A 全集中不属于 A \overline A= \{ x \in U \vee x \notin A\}
差集 - 属于 A 不属于 B A-B=\{ x \in A \vee x \notin B\}
对称差 属于 AB不同时属于两者 A△B=(A−B)\cup(B−A)

3、加法原理

概念:完成一件事有 n 类不同方案,第 i 类有 m_i 种方法,各类互不重叠,则总方法数:m_1+m_2+\dots+m_n

关键词:“要么……要么……”、分类、或等

易错:各类必须互斥,否则需用容斥原理修正。

4、乘法原理

概念:完成一件事需 n 个连续步骤,第 i 步有 m_i 种方法,各步独立,则总方法数:m_1 \times m_2 \times \dots\times m_n

关键词:“先……再……”、分步、且等

易错:每一步方法数必须固定不变(不能受之前影响)。若某一步受前一步影响,则不能直接相乘,要分类讨论。

5、抽屉原理

概念:把 n+1 个物体放入 n 个抽屉,则至少有一个抽屉里有至少 2 个物体。 推广:把 kn+1 个物体放入 n 个抽屉,则至少有一个抽屉里有至少 k+1 个物体。

6、容斥原理

这个计数原理及其重要,前面几个小学的时候就都学过,但是容斥原理在小学应该也只是初步学习而已。

二集合公式|A \cup B|=|A|+|B|-|A \cap B|

三集合公式|A\cup B\cup C|=|A|+|B|+|C|-|A\cap B|-|A\cap c|-|B\cap C|+|A \cap B \cap C|

对此,进行一个推广:设满足属性 i 的集合为 S_i\overline {S_i} 表示不满足属性 i 的集合,即满足 x_i \geq n_i+1 的集合。那么答案为:

|\bigcap^k_{i=1} S_i|=|U|-|\bigcup^k_{i=1}\overline {S_i}|

根据容斥原理,有:

|\bigcup^k_{i=1}\overline {S_i}|=\sum_i|\overline {S_i}|-\sum_{i,j}|\overline {S_i} \cap \overline {S_j}|+\sum_{i,j,k}|\overline {S_i} \cap \overline {S_j} \cap \overline {S_k}|-\dots+(-1)^{k-1}|\bigcap^k_{i=1} \overline{S_i}| \\ =\sum_i{(^{k+r-n_i-2}_{k-1})}-\sum_{i,j}{(^{k+r-n_i-n_j-3}_{k-1})}+\sum_{i,j,k}{(^{k+r-n_i-n_j-n_k-4}_{k-1})}- \dots + (-1)^{k-1}{(^{k+r-\sum^k_{i=1}{n_i}-k-1}_{k-1})}

拿全集 |U|=(^{k+r-1}_{k-1}),减去上式,得到多重集的组合数:

Ans=\sum^k_{p=0} (-1)^p \sum_A(^{k+r-1-\sum_A n_{A_i}-p}_{k-1})

通俗地讲:奇数个条件,做减法;偶数个条件,做加法。(不会也没关系)

板块三:排列组合

1、排列数 A(n,m)

概念

n 个不同元素中有序的取出 m 个。(顺序不同算不同方案)

公式

A(n,m) = A^{n}_{m} = n \times (n-1) \times \dots\times (n-m+1)=\frac{n!}{(n-m)!}

2、组合数 C(n,m)

概念

n 个不同元素中无序地取出 m 个。(与顺序无关)

公式

C(n,m) = C^{n}_{m} =\frac{A^{n}_{m}}{m!}=\frac{n!}{m!(n-m)!}

性质

可重复组合

概念:从 n不同元素中取出 r 个元素组成一个组合,且允许这 r 个元素重复使用,则称这样的组合为可重复组合

公式:组合数记为 H(n,r)H(n,r) = C^r_{n+r-1}

3、捆绑法(相邻问题)

用处:几个元素必须排在一起 。

步骤

4、插空法(不相邻问题)

用处:几个元素不能相邻。

步骤

5、隔板法(相同物品分配)

用处:把 n相同物品分给 k不同盒子。

步骤

技巧:用 先每人给1个 将 不允许空盒 转化为 允许空盒。

6、环形排列

公式n不同元素围成圆排列,有 (n−1)! 种。

7、错排问题(S组)

概念n 个元素全都不在自己原来位置的排列数,记作 D_n

公式D_n=(n-1)(D_{n-1}-D_{n-2})

边界D_1=0D_2=1

8、卡特兰数(S组)

是一个计数问题的经典数列,前几项为: 1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900 \dots

公式

f(n)=\frac{f(n-1)\times (4n-2)}{n+1} f(n)=C^n_{2n}-C^{n-1}_{2n} f(n)=\frac{C^n_{2n}}{n+1}

应用场景n 对括号合法序列数、n 个节点二叉树的形态数等。

9、第二类斯特林数

概念

n 个不同的球放到 k 个相同的盒子里,假设没有空盒,则放球方案数记作 S(n,k),称为第二类斯特林数。

递推公式

S(n,k)=k \times S(n-1,k)+S(n-1,k-1), \quad n > k \geq1

边界S(n,1)=1S(n,n)=1

考虑最后一个球,若它单独放一个盒子,有 S(n-1,k-1) 种放法;若是和前面的某一个球放在同一个盒子里,则有 k\times S(n-1,k) 种放法。

板块四:概率论基础

1、事件与概率

随机试验、样本空间和样本点

相同条件下可以重复进行;每次试验的可能结果可以不止一个,并能事先明确试验的所有可能结果结果不确定的试验。

随机试验所有可能结果的集合,叫做样本空间,一般记为 S。其中的元素即为试验的每个结果,称为样本点

事件

事件关系与运算

当有多个事件时,可以表示成 \bigcup ^n_{k=1} A_k

当有多个事件时,可以表示成 \bigcap ^n_{k=1} A_k

频率与概率

频率:如果在相同的条件下进行了 n 次试验,在这 n 次试验中,事件 A 发生了 N_A 次,那么 \frac{N_A}{n} 称为事件 A 发生的频率

概率:在大量进行同一重复试验时,事件 A 发生的频率总是在某种意义下接近某个常数,这个常数就是事件 A概率 P(A)

概率的性质(S组):

2、古典概率

定义

如果某次试验满足:

则称该试验为古典概型,计算古典概型的方法称为古典概率。事件 A 的概率为:

P(A)=\frac{事件 A 包含的样本点数}{样本空间总样本点数}=\frac{|A|}{|\Omega|}

3、数学期望(S组)

期望定义

举个例子:我们来玩一个游戏,如果有 14 张纸牌,其中有 1 张是 A。如果你抽中了 10 元,庄主赔了 10 元,否则你赔他 1 元。

分析这个例子,抽中的概率是 \frac{1}{14},结果是赢 10 块钱;抽不中的概率是 \frac{13}{14},结果是输 1 块钱。把概率和各自的结果相乘,然后相加,得到的“数学期望值”就是 -\frac{3}{14}。因此,我们可以引出结论:

对于离散型变量 X,其取值为 x_1,x_2,\dots,x_n,对应概率为 p_1,p_2,\dots,p_n,则期望值

E(X)=\sum^n_{i=1} x_i \cdot p_i

联系一下其他知识,公式里的 x_i \cdot p_i,可以认为是每一个取值对期望值的贡献,而期望值就是贡献和。

期望性质

总结

就讲到这吧,应该已经够用了。初赛最为重要的其实还是排列组合和一些简单的数论知识,像期望这一些东西作者并没有在初赛试题中见到很多。

参考文章

浅谈拓展欧几里得算法(Exgcd) - 洛谷专栏