数学与数论
目录
-
常见数学符号
-
数列求和
-
快速幂
-
整除
-
组合计数
常见数学符号
数理逻辑
- 与、或、非
p∧q,p∨q,p¬qp \wedge q \text{,} p \vee q \text{,} p \neg qp∧q,p∨q,p¬q
- 蕴含、等价于
p⟹q,p⟺qp \Longrightarrow q \text{,} p \Longleftrightarrow qp⟹q,p⟺q
关系
- 等于、不等于、约等于
a=b,a≠b,a≈ba = b \text{,} a \neq b \text{,} a \approx ba=b,a=b,a≈b
- 小于、大于、小于等于、大于等于
a<b, a>b, a≤b, a≥ba < b \text{, } a > b \text{, } a \leq b \text{, } a \ge ba<b, a>b, a≤b, a≥b
- 整除、互素、同余
a∣b, a⊥b, a≡b(modm)a \mid b \text{, } a \perp b \text{, } a \equiv b \pmod{m} a∣b, a⊥b, a≡b(modm)
运算符
- 加、减、乘、除
a+b,a−b,a×b,a÷ba + b \text{,} a - b \text{,} a \times b \text{,} a \div ba+b,a−b,a×b,a÷b
- 加或减
a±ba \pm ba±b
- 次方
aba ^ bab
- 开根
an\sqrt[n]{a}na
- 绝对值
∣a∣\mid a \mid∣a∣
- 取整
⌊a⌋,⌈b⌉ \lfloor a \rfloor \text{,} \lceil b \rceil⌊a⌋,⌈b⌉
- 取模
a mod ba \bmod bamodb
- 最值
min(a,b),max(a,b)min(a, b) \text{,} max(a, b)min(a,b),max(a,b)
- 最大公因数、最小公倍数
gcd(a,b),lcm(a,b)\gcd(a, b) \text{,} \operatorname{lcm}(a, b)gcd(a,b),lcm(a,b)
- 求和
∑i=1nai=a1+a2+⋯+an\sum_{i = 1}^{n} a_i = a_1 + a_2 + \cdots + a_ni=1∑nai=a1+a2+⋯+an
- 求积
∏i=1nai=a1×a2×⋯×an\prod_{i = 1}^{n} a_i = a_1 \times a_2 \times \cdots \times a_ni=1∏nai=a1×a2×⋯×an
集合
- 属于、不属于
x∈S,x∉Sx \in S \text{,} x\notin Sx∈S,x∈/S
- 元素个数、空集
∣S∣,∅\mid S \mid \text{,} \emptyset∣S∣,∅
- 包含、真包含
A⊆B,A⊂BA \subseteq B \text{,} A \subset BA⊆B,A⊂B
- 并集、交集、差集
A∪B,A∩B,A∖BA \cup B \text{,} A \cap B \text{,} A \setminus BA∪B,A∩B,A∖B
标准数集和区间
- 自然数集、整数集、有理数集、实数集、复数集、素数集
N,Z,Q,R,C,P\mathbb{N} \text{,} \mathbb{Z} \text{,} \mathbb{Q} \text{,} \mathbb{R} \text{,} \mathbb{C} \text{,} \mathbb{P}N,Z,Q,R,C,P
- 闭区间、开区间、左开右闭区间、左闭右开区间
[a,b],(a,b),(a,b],[a,b)[a, b] \text{,} (a, b) \text{,} (a, b] \text{,} [a, b)[a,b],(a,b),(a,b],[a,b)
- 无穷大
∞\infty∞
指数和对数函数
- 自然对数
e=limn→∞(1+1n)n=2.7188128⋯e = \lim_{n \to \infty} (1 + \frac{1}{n}) ^ n = 2.7188128 \cdotse=n→∞lim(1+n1)n=2.7188128⋯
- xxx 的以 aaa 为底的对数
logax\log_axlogax
- xxx 的自然对数
lnx\ln xlnx
- xxx 的常用对数
lgx\lg xlgx
数列求和
- 等差数列求和:
假设等差数列的首项为 a1a_1a1,末项为 ana_nan,项数为 nnn,那么等差数列的和为:
Sn=n(a1+an)2S_n = \frac{n(a_1 + a_n)}{2}Sn=2n(a1+an)
假设等差数列的首项为 a1a_1a1,项数为 nnn,公差为 ddd,那么等差数列的和为:
Sn=a1n+n(n−1)2dS_n = a_1n + \frac{n(n - 1)}{2}dSn=a1n+2n(n−1)d
- 等比数列求和:
假设等比数列的首项为 a1a_1a1,项数为 nnn,公比为 qqq,那么等比数列的和为:
Sn=a1(1−qn)1−qS_n = \frac{a_1(1 - q ^ n)}{1 - q}Sn=1−qa1(1−qn)
假设等比数列的首项为 a1a_1a1,有无穷项,公比为 qqq,那么等比数列的和(若存在)为:
Sn=a1−anq1−qS_n = \frac{a_1 - a_nq}{1 - q}Sn=1−qa1−anq
快速幂
计算:xymod zx ^ y \mod zxymodz
inline [type] qpow([type] x, int y, const int z){
[type] ans = 1;
while (y){
if (y & 1) ans = ans * x % z;
x = x * x % z, y >>= 1;
}
return ans;
}
整除
假设 nnn 为非负整数,ddd 为正整数,aaa、bbb 为非负整数:
-
若 nd\frac{n}{d}dn 为整数,则称 ddd 整除 nnn,写作 d∣nd \mid nd∣n。此时 ddd 被称为 nnn 的 约数,而 nnn 被称为 ddd 的 倍数
-
若 d∣ad \mid ad∣a 且 d∣bd \mid bd∣b,则称 ddd 为 aaa 和 bbb 的 公约数。最大公约数 是 aaa 和 bbb 的所有公约数中最大的数,常记作 gcd(a,b)gcd(a, b)gcd(a,b)(当 gcd(a,b)=1gcd(a, b) = 1gcd(a,b)=1 时,我们称 aaa、bbb 为 互素 关系)
辗转相除法求最大公约数
设 a=b×k+ca = b \times k + ca=b×k+c(bbb 不能整除 aaa),ddd 为 aaa、bbb 的公约数:
∵c=a mod b<b\because c = a \bmod b < b∵c=amodb<b
∴c=a−bk\therefore c = a - bk∴c=a−bk
∵d∣a&d∣b\because d \mid a \And d \mid b∵d∣a&d∣b
∴cd=ad−bdk\therefore \frac{c}{d} = \frac{a}{d} - \frac{b}{d}k∴dc=da−dbk
∴cd∈Z\therefore \frac{c}{d} \in \mathbb{Z}∴dc∈Z
∴d∣(a mod b)→d∣b&d∣(a mod b)\therefore d \mid (a \bmod b) \rightarrow d \mid b \And d \mid (a \bmod b)∴d∣(amodb)→d∣b&d∣(amodb)
反之,假设 d∣b&d∣(a mod b)d \mid b \And d \mid (a \bmod b)d∣b&d∣(amodb),也可证明其是 aaa、bbb 的公约数
可得 aaa、bbb 与 b,(a mod b)b, (a \bmod b)b,(amodb) 的最大公约数相等
即 gcd(a,b)=gcd(b,a mod b)\gcd(a, b) = \gcd(b, a \bmod b)gcd(a,b)=gcd(b,amodb)
inline [type] gcd([type] x, [type] y){
return !y ? x : gcd(y, x % y);
}
- 若 a∣da \mid da∣d 且 b∣db \mid db∣d,则称 ddd 为 aaa 和 bbb 的 公倍数。最小公倍数 是 aaa 和 bbb 的所有公倍数中最小的数,常记作 lcm(a,b)\operatorname{lcm}(a, b)lcm(a,b)
lcm(a,b)=a×bgcd(a,b)\operatorname{lcm}(a, b) = \frac{a \times b}{\gcd(a, b)}lcm(a,b)=gcd(a,b)a×b
inline [type] lcm([type] x, [type] y){
return x * y / gcd(x, y);
}
素数
对于一个整数 n≥2n \ge 2n≥2,若所有满足 1<k<n1 < k < n1<k<n 的整数 kkk 都不是 nnn 的约数,那么称 nnn 为 素数
判断素数
时间复杂度:O(n)O(\sqrt{n})O(n)
inline bool check([type] x){
if (x == 1) return 0;
for ([type] i = 2; i * i <= x; ++i) if (!(x % i)) return 0;
return 1;
}
素数的分布
定义 π(x)\pi(x)π(x) 表示小于等于 xxx 的素数的个数,其中:
π(x)∼xln(x)\pi(x) \sim \frac{x}{\ln(x)}π(x)∼ln(x)x
即小于等于 nnn 的正整数中有 O(nlogn)O(\frac{n}{\log n})O(lognn) 个数为素数数
素数筛
方法一:对于 1∼N1 ∼ N1∼N 的每个正整数判断是否为素数。时间复杂度为 O(nn)O(n \sqrt{n})O(nn) ,效率最低
方法二:埃式筛法:对于 2∼n2 ∼ n2∼n 的每个正整数 xxx,若 xxx 为素数,则标记所有大于 xxx 小于 nnn 的 xxx 的倍数。枚举到 xxx 时,若 xxx 没有被标记,则 xxx 为素数,其时间复杂度为 O(nloglogn)O(n \log \log n)O(nloglogn)
inline void sieve([type] N){
memset(P, 1, sizeof(P)), P[0] = P[1] = 0;
for ([type] i = 2; i < N; ++i){
if (!P[i] || i * i >= N) continue;
for ([type] j = i * i; j < N; j += i) P[j] = 0;
}
}
方法三:线性筛:从埃氏筛法改进而来,使每个合数只被它的最小质因数筛去,这样就能保证每个合数只被筛一次。比如埃氏筛法中 666 在已经被 222 筛去的情况下又被 333 筛了一遍,而我们希望 666 只被 222 筛去。这样就可以将整个算法的时间复杂度从 O(nloglogn)O(n \log \log n)O(nloglogn) 降到 O(n)O(n)O(n)
inline void sieve([type] N){
for (int i = 2; i <= N; ++i){
if (!vis[i]) ++cnt, P[cnt] = i;
for (int j = 1; j <= cnt && i * P[j] <= N; ++j){
vis[i * P[j]] = 1;
if (!(i % P[j])) break;
}
}
}
唯一分解定理
假设 n≥2∈Zn \ge 2 \in \mathbb{Z}n≥2∈Z,则有唯一的分解式:
n=∏i=1mpikin = \prod_{i = 1}^{m} p_i^{k_i}n=i=1∏mpiki
其中,p1<p2<⋯<pm∈Pp_1 < p_2 < \cdots < p_m \in \mathbb{P}p1<p2<⋯<pm∈P,ki∈N>0k_i \in \mathbb{N} > 0ki∈N>0
该分解式也常被人称为 质因数分解
vector<int> factor(int N){
vector<int> F;
for (int i = 1; i <= P[0]; ++i) {
if (P[i] * P[i] > N) break;
while (N % P[i] == 0) F.push_back(P[i]), N /= P[i];
}
if (N > 1) f.push_back(N);
return F;
}
预处理复杂度:O(n)O(\sqrt{n})O(n),单词查询复杂度:O(nlnn)O(\frac{\sqrt{n}}{\ln n})O(lnnn)
模运算与同余
设 aaa、bbb 为正整数,则 a mod b=a−⌊ab⌋ba \bmod b = a - \lfloor \frac{a}{b} \rfloor bamodb=a−⌊ba⌋b
若 (a−b) mod n=0(a - b) \bmod n = 0(a−b)modn=0,则称 aaa、bbb 同余,记作:
a≡b(modn)a \equiv b \pmod{n} a≡b(modn)
根据模运算,我们可以得到下列等式:
-
(a+b) mod p=(a mod p+b mod p) mod p(a + b) \bmod p = (a \bmod p + b \bmod p) \bmod p(a+b)modp=(amodp+bmodp)modp
-
(a−b) mod p=(a mod p−b mod p+p) mod p(a - b) \bmod p = (a \bmod p - b \bmod p + p) \bmod p(a−b)modp=(amodp−bmodp+p)modp
-
ab mod p=((a mod p)×(b mod p)) mod pab \bmod p = ((a \bmod p) \times (b \bmod p)) \bmod pabmodp=((amodp)×(bmodp))modp
-
ab mod p=(a mod p)b mod pa ^ b \bmod p = (a \bmod p) ^ b \bmod pabmodp=(amodp)bmodp
裴蜀定理
设 aaa、bbb 是不全为 000 的整数,则必定存在整数 xxx、yyy,满足不定方程 ax+by=gcd(a,b)ax + by = \gcd(a, b)ax+by=gcd(a,b)
求解该不定方程,需要使用 扩展欧几里得算法:
当 b=0b = 0b=0 时,原方程转换为 ax=gcd(a,0)=a→x=1ax = \gcd(a, 0) = a \rightarrow x = 1ax=gcd(a,0)=a→x=1
当 b≠0b \ne 0b=0 时,由于 gcd(a,b)=gcd(b,a mod b)\gcd(a, b) = \gcd(b, a \bmod b)gcd(a,b)=gcd(b,amodb),因此我们希望找到一对 (x’,y’)(x’, y’)(x’,y’),满足:
bx′+(a mod b)y′=gcd(b,a mod b)bx' + (a \bmod b)y' = \gcd(b, a \bmod b)bx′+(amodb)y′=gcd(b,amodb)
对于原方程,根据 a=⌊ab⌋b+a mod ba = \lfloor \frac{a}{b} \rfloor b + a \bmod ba=⌊ba⌋b+amodb 代入可得:
(⌊ab⌋b+a mod b)x+by=gcd(a,b)(\lfloor \frac{a}{b} \rfloor b + a \bmod b)x + by = \gcd(a, b)(⌊ba⌋b+amodb)x+by=gcd(a,b)
整理可得:
b(⌊ab⌋x+y)+(a mod b)x=gcd(b,a mod b)b(\lfloor \frac{a}{b} \rfloor x + y) + (a \bmod b)x = \gcd(b, a \bmod b)b(⌊ba⌋x+y)+(amodb)x=gcd(b,amodb)
综合两个式子:
{bx′+(a mod b)y′=gcd(b,a mod b)b(⌊ab⌋x+y)+(a mod b)x=gcd(b,a mod b) \begin{cases} bx' + (a \bmod b)y' = \gcd(b, a \bmod b) \\ b(\lfloor \frac{a}{b} \rfloor x + y) + (a \bmod b)x = \gcd(b, a \bmod b) \end{cases} {bx′+(amodb)y′=gcd(b,amodb)b(⌊ba⌋x+y)+(amodb)x=gcd(b,amodb)
比较系数可得:
{x=y′y=x′−⌊ab⌋x \begin{cases} x = y' \\ y = x' - \lfloor \frac{a}{b} \rfloor x \end{cases} {x=y′y=x′−⌊ba⌋x
因此可以递归求解:
inline [type] exgcd([type] a, [type] b, [type] &x, [type] &y){
if (!b){
x = 1, y = 0;
return a;
}
[type] d = exgcd(b, a % b, x, y);
[type] t = x;
x = y, y = t - (a / b) * y;
return d;
}
乘法逆元
实际上,我们求出的 xxx 被称作 a mod ba \bmod bamodb 的逆元,记作 a−1a ^ {-1}a−1。当 xxx 与 bbb 互素时,存在唯一的 xxx 的逆元。当 bbb 是素数时,所有不是 bbb 的倍数的整数都有唯一的逆元。
使用乘法逆元可以帮助我们完成模意义下的除法运算:
ab≡a×b−1(modp)\frac{a}{b} \equiv a \times b ^ {-1} \pmod{p}ba≡a×b−1(modp)
欧拉函数
φ(i)\varphi(i)φ(i) 表示,小于等于 iii 的正整数中,与 iii 互质的数的个数
欧拉函数具有以下的性质:
-
φ(pk)=pk−pk−1\varphi(p^k) = p^k - p^{k - 1}φ(pk)=pk−pk−1(p∈Pp \in \mathbb{P}p∈P)
-
欧拉函数是 积性函数,即若 gcd(a,b)=1\gcd(a, b) = 1gcd(a,b)=1,则有 φ(a)×φ(b)=φ(a×b)\varphi(a) \times \varphi(b) = \varphi(a \times b)φ(a)×φ(b)=φ(a×b)
-
欧拉反演:∑d∣nφ(d)=n\sum_{d \mid n} \varphi(d) = n∑d∣nφ(d)=n
欧拉函数的计算:
如果只需求出 φ(n)\varphi(n)φ(n):求出 nnn 的唯一分解 n=∏i=1mpikin = \prod_{i = 1}^{m} p_i^{k_i}n=∏i=1mpiki
根据积性,φ(n)=∏i=1mφ(piki)\varphi(n) = \prod_{i = 1}^{m} \varphi(p_i^{k_i})φ(n)=∏i=1mφ(piki),根据 φ(pk)=pk−pk−1\varphi(p^k) = p^k - p^{k - 1}φ(pk)=pk−pk−1 可求
若需批量求出 φ(n)\varphi(n)φ(n) 可以利用到线性筛:
设 ppp 是 iii 的最小质因子,则分三种情况:
-
iii 是素数,则 φ(i)=i−1\varphi(i) = i - 1φ(i)=i−1
-
ppp 为 ip\frac{i}{p}pi 的质因子,则 φ(i)=φ(ip)×p\varphi(i) = \varphi(\frac{i}{p}) \times pφ(i)=φ(pi)×p
-
ppp 为 ip\frac{i}{p}pi 互素,则 φ(i)=φ(ip)×φ(p)\varphi(i) = \varphi(\frac{i}{p}) \times \varphi(p)φ(i)=φ(pi)×φ(p)
inline void euler([type] N) {
E[1] = 1;
for ([type] i = 2; i <= N; ++i){
if (!vis[i]) ++cnt, P[cnt] = i, E[i] = i - 1;
for ([type] j = 1; j <= cnt && i * P[j] <= N; ++j){
vis[i * P[j]] = 1;
if (i % P[j]) E[i * P[j]] = E[i] * E[P[j]];
else {
E[i * P[j]] = E[i] * P[j];
break;
}
}
}
}
组合计数
加法原理和乘法原理
加法原理:完成一项工作有 nnn 类方法,第 iii 类方法下又有 aia_iai 类方法,那么完成这项工作总共有 ∑i=1nai\sum_{i = 1} ^ {n} a_i∑i=1nai 种方法
乘法原理:完成一项工作有 nnn 步方法,第 iii 步方法下又有 aia_iai 步方法,那么完成这项工作总共有 ∏i=1nai\prod_{i = 1}^{n} a_i∏i=1nai 种方法
排列数
AnmA_{n}^{m}Anm 表示从 nnn 个不重复的元素中选择 mmm 个按照一定顺序排列的方案数
根据乘法原理,第一个位置有 nnn 种选法,第二个位置有 n−1n − 1n−1 种
选法,第三个位置有 n−2n − 2n−2 种选法,以此类推,可得:
Anm=n×(n−1)×(n−2)×⋯×(n−m+1)=n!(n−m)!A_{n}^{m} = n \times (n - 1) \times (n - 2) \times \cdots \times (n - m + 1) = \frac{n!}{(n - m)!}Anm=n×(n−1)×(n−2)×⋯×(n−m+1)=(n−m)!n!
组合数
CnmC_{n}^{m}Cnm 表示从 nnn 个不重复的元素中选择 mmm 个的方案数
根据排列数,每种方案被计算了 m!m!m! 次,因此可得:
Cnm=Anmm!=n!m!(n−m)!C_{n}^{m} = \frac{A_{n}^{m}}{m!} = \frac{n!}{m! (n - m)!}Cnm=m!Anm=m!(n−m)!n!
组合恒等式
根据组合数的计算方式,可以得到一系列的恒等式:
-
Cnm=Cnn−mC_{n}^{m} = C_{n}^{n - m}Cnm=Cnn−m
-
Cnm=Cn−1m+Cn−1m−1C_{n}^{m} = C_{n - 1}^{m} + C_{n - 1}^{m - 1}Cnm=Cn−1m+Cn−1m−1(杨辉三角递推)
-
∑i=0nCni=2n\sum_{i = 0}^{n} C_{n}^{i} = 2 ^ n∑i=0nCni=2n
-
(x+y)n=∑i=0nCnixn−1yi(x + y) ^ n = \sum_{i = 0}^{n} C_{n}^{i} x ^ {n - 1} y ^ i(x+y)n=∑i=0nCnixn−1yi(二项式定理)
捆绑法、插空法、隔板法
如果要求若干物品相邻,则可以将它们作为一个整体来进行计数
如果要求若干物品两两不相邻,可以先将其他物品放好,然后将
这些物品插入空当中,进行计数
通过加入隔板将问题转化,解决给相同元素分组的方案数问题
容斥原理
假设有两类元素 AAA、BBB,总元素个数为 AAA 元素个数 +++ BBB 元素个数 −-− 既是 AAA 类也是 BBB 类的元素个数
把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去的方式被称为 容斥原理
假设有三类元素 AAA、BBB、CCC,总元素个数为:
∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣B∩C∣−∣A∩C∣+∣A∩B∩C∣\mid A \cup B \cup C \mid = \mid A \mid + \mid B \mid + \mid C \mid - \mid A \cap B \mid - \mid B \cap C \mid - \mid A \cap C \mid + \mid A \cap B \cap C \mid ∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣B∩C∣−∣A∩C∣+∣A∩B∩C∣
781

被折叠的 条评论
为什么被折叠?



