数学与数论
目录
-
常见数学符号
-
数列求和
-
快速幂
-
整除
-
组合计数
常见数学符号
数理逻辑
- 与、或、非
p ∧ q , p ∨ q , p ¬ q p \wedge q \text{,} p \vee q \text{,} p \neg q p∧q,p∨q,p¬q
- 蕴含、等价于
p ⟹ q , p ⟺ q p \Longrightarrow q \text{,} p \Longleftrightarrow q p⟹q,p⟺q
关系
- 等于、不等于、约等于
a = b , a ≠ b , a ≈ b a = b \text{,} a \neq b \text{,} a \approx b a=b,a=b,a≈b
- 小于、大于、小于等于、大于等于
a < b , a > b , a ≤ b , a ≥ b a < b \text{, } a > b \text{, } a \leq b \text{, } a \ge b a<b, a>b, a≤b, a≥b
- 整除、互素、同余
a ∣ b , a ⊥ b , a ≡ b ( m o d m ) 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 ÷ b a + b \text{,} a - b \text{,} a \times b \text{,} a \div b a+b,a−b,a×b,a÷b
- 加或减
a ± b a \pm b a±b
- 次方
a b a ^ b ab
- 开根
a n \sqrt[n]{a} na
- 绝对值
∣ a ∣ \mid a \mid ∣a∣
- 取整
⌊ a ⌋ , ⌈ b ⌉ \lfloor a \rfloor \text{,} \lceil b \rceil ⌊a⌋,⌈b⌉
- 取模
a m o d b a \bmod b amodb
- 最值
m i n ( a , b ) , m a x ( 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 = 1 n a i = a 1 + a 2 + ⋯ + a n \sum_{i = 1}^{n} a_i = a_1 + a_2 + \cdots + a_n i=1∑nai=a1+a2+⋯+an
- 求积
∏ i = 1 n a i = a 1 × a 2 × ⋯ × a n \prod_{i = 1}^{n} a_i = a_1 \times a_2 \times \cdots \times a_n i=1∏nai=a1×a2×⋯×an
集合
- 属于、不属于
x ∈ S , x ∉ S x \in S \text{,} x\notin S x∈S,x∈/S
- 元素个数、空集
∣ S ∣ , ∅ \mid S \mid \text{,} \emptyset ∣S∣,∅
- 包含、真包含
A ⊆ B , A ⊂ B A \subseteq B \text{,} A \subset B A⊆B,A⊂B
- 并集、交集、差集
A ∪ B , A ∩ B , A ∖ B A \cup B \text{,} A \cap B \text{,} A \setminus B A∪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 = lim n → ∞ ( 1 + 1 n ) n = 2.7188128 ⋯ e = \lim_{n \to \infty} (1 + \frac{1}{n}) ^ n = 2.7188128 \cdots e=n→∞lim(1+n1)n=2.7188128⋯
- x x x 的以 a a a 为底的对数
log a x \log_ax logax
- x x x 的自然对数
ln x \ln x lnx
- x x x 的常用对数
lg x \lg x lgx
数列求和
- 等差数列求和:
假设等差数列的首项为 a 1 a_1 a1,末项为 a n a_n an,项数为 n n n,那么等差数列的和为:
S n = n ( a 1 + a n ) 2 S_n = \frac{n(a_1 + a_n)}{2} Sn=2n(a1+an)
假设等差数列的首项为 a 1 a_1 a1,项数为 n n n,公差为 d d d,那么等差数列的和为:
S n = a 1 n + n ( n − 1 ) 2 d S_n = a_1n + \frac{n(n - 1)}{2}d Sn=a1n+2n(n−1)d
- 等比数列求和:
假设等比数列的首项为 a 1 a_1 a1,项数为 n n n,公比为 q q q,那么等比数列的和为:
S n = a 1 ( 1 − q n ) 1 − q S_n = \frac{a_1(1 - q ^ n)}{1 - q} Sn=1−qa1(1−qn)
假设等比数列的首项为 a 1 a_1 a1,有无穷项,公比为 q q q,那么等比数列的和(若存在)为:
S n = a 1 − a n q 1 − q S_n = \frac{a_1 - a_nq}{1 - q} Sn=1−qa1−anq
快速幂
计算: x y m o d z x ^ y \mod z xymodz
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;
}
整除
假设 n n n 为非负整数, d d d 为正整数, a a a、 b b b 为非负整数:
-
若 n d \frac{n}{d} dn 为整数,则称 d d d 整除 n n n,写作 d ∣ n d \mid n d∣n。此时 d d d 被称为 n n n 的 约数,而 n n n 被称为 d d d 的 倍数
-
若 d ∣ a d \mid a d∣a 且 d ∣ b d \mid b d∣b,则称 d d d 为 a a a 和 b b b 的 公约数。最大公约数 是 a a a 和 b b b 的所有公约数中最大的数,常记作 g c d ( a , b ) gcd(a, b) gcd(a,b)(当 g c d ( a , b ) = 1 gcd(a, b) = 1 gcd(a,b)=1 时,我们称 a a a、 b b b 为 互素 关系)
辗转相除法求最大公约数
设 a = b × k + c a = b \times k + c a=b×k+c( b b b 不能整除 a a a), d d d 为 a a a、 b b b 的公约数:
∵ c = a m o d b < b \because c = a \bmod b < b ∵c=amodb<b
∴ c = a − b k \therefore c = a - bk ∴c=a−bk
∵ d ∣ a & d ∣ b \because d \mid a \And d \mid b ∵d∣a&d∣b
∴ c d = a d − b d k \therefore \frac{c}{d} = \frac{a}{d} - \frac{b}{d}k ∴dc=da−dbk
∴ c d ∈ Z \therefore \frac{c}{d} \in \mathbb{Z} ∴dc∈Z
∴ d ∣ ( a m o d b ) → d ∣ b & d ∣ ( a m o d 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 m o d b ) d \mid b \And d \mid (a \bmod b) d∣b&d∣(amodb),也可证明其是 a a a、 b b b 的公约数
可得
a
a
a、
b
b
b 与
b
,
(
a
m
o
d
b
)
b, (a \bmod b)
b,(amodb) 的最大公约数相等
即
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
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 ∣ d a \mid d a∣d 且 b ∣ d b \mid d b∣d,则称 d d d 为 a a a 和 b b b 的 公倍数。最小公倍数 是 a a a 和 b b b 的所有公倍数中最小的数,常记作 lcm ( a , b ) \operatorname{lcm}(a, b) lcm(a,b)
lcm ( a , b ) = a × b gcd ( 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 ≥ 2 n \ge 2 n≥2,若所有满足 1 < k < n 1 < k < n 1<k<n 的整数 k k k 都不是 n n n 的约数,那么称 n n n 为 素数
判断素数
时间复杂度: 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) 表示小于等于 x x x 的素数的个数,其中:
π ( x ) ∼ x ln ( x ) \pi(x) \sim \frac{x}{\ln(x)} π(x)∼ln(x)x
即小于等于 n n n 的正整数中有 O ( n log n ) O(\frac{n}{\log n}) O(lognn) 个数为素数数
素数筛
方法一:对于 1 ∼ N 1 ∼ N 1∼N 的每个正整数判断是否为素数。时间复杂度为 O ( n n ) O(n \sqrt{n}) O(nn) ,效率最低
方法二:埃式筛法:对于 2 ∼ n 2 ∼ n 2∼n 的每个正整数 x x x,若 x x x 为素数,则标记所有大于 x x x 小于 n n n 的 x x x 的倍数。枚举到 x x x 时,若 x x x 没有被标记,则 x x x 为素数,其时间复杂度为 O ( n log log n ) 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;
}
}
方法三:线性筛:从埃氏筛法改进而来,使每个合数只被它的最小质因数筛去,这样就能保证每个合数只被筛一次。比如埃氏筛法中 6 6 6 在已经被 2 2 2 筛去的情况下又被 3 3 3 筛了一遍,而我们希望 6 6 6 只被 2 2 2 筛去。这样就可以将整个算法的时间复杂度从 O ( n log log n ) 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 ∈ Z n \ge 2 \in \mathbb{Z} n≥2∈Z,则有唯一的分解式:
n = ∏ i = 1 m p i k i n = \prod_{i = 1}^{m} p_i^{k_i} n=i=1∏mpiki
其中, p 1 < p 2 < ⋯ < p m ∈ P p_1 < p_2 < \cdots < p_m \in \mathbb{P} p1<p2<⋯<pm∈P, k i ∈ N > 0 k_i \in \mathbb{N} > 0 ki∈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 ( n ln n ) O(\frac{\sqrt{n}}{\ln n}) O(lnnn)
模运算与同余
设 a a a、 b b b 为正整数,则 a m o d b = a − ⌊ a b ⌋ b a \bmod b = a - \lfloor \frac{a}{b} \rfloor b amodb=a−⌊ba⌋b
若 ( a − b ) m o d n = 0 (a - b) \bmod n = 0 (a−b)modn=0,则称 a a a、 b b b 同余,记作:
a ≡ b ( m o d n ) a \equiv b \pmod{n} a≡b(modn)
根据模运算,我们可以得到下列等式:
-
( a + b ) m o d p = ( a m o d p + b m o d p ) m o d p (a + b) \bmod p = (a \bmod p + b \bmod p) \bmod p (a+b)modp=(amodp+bmodp)modp
-
( a − b ) m o d p = ( a m o d p − b m o d p + p ) m o d p (a - b) \bmod p = (a \bmod p - b \bmod p + p) \bmod p (a−b)modp=(amodp−bmodp+p)modp
-
a b m o d p = ( ( a m o d p ) × ( b m o d p ) ) m o d p ab \bmod p = ((a \bmod p) \times (b \bmod p)) \bmod p abmodp=((amodp)×(bmodp))modp
-
a b m o d p = ( a m o d p ) b m o d p a ^ b \bmod p = (a \bmod p) ^ b \bmod p abmodp=(amodp)bmodp
裴蜀定理
设 a a a、 b b b 是不全为 0 0 0 的整数,则必定存在整数 x x x、 y y y,满足不定方程 a x + b y = gcd ( a , b ) ax + by = \gcd(a, b) ax+by=gcd(a,b)
求解该不定方程,需要使用 扩展欧几里得算法:
当 b = 0 b = 0 b=0 时,原方程转换为 a x = gcd ( a , 0 ) = a → x = 1 ax = \gcd(a, 0) = a \rightarrow x = 1 ax=gcd(a,0)=a→x=1
当 b ≠ 0 b \ne 0 b=0 时,由于 gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a, b) = \gcd(b, a \bmod b) gcd(a,b)=gcd(b,amodb),因此我们希望找到一对 ( x ’ , y ’ ) (x’, y’) (x’,y’),满足:
b x ′ + ( a m o d b ) y ′ = gcd ( b , a m o d b ) bx' + (a \bmod b)y' = \gcd(b, a \bmod b) bx′+(amodb)y′=gcd(b,amodb)
对于原方程,根据 a = ⌊ a b ⌋ b + a m o d b a = \lfloor \frac{a}{b} \rfloor b + a \bmod b a=⌊ba⌋b+amodb 代入可得:
( ⌊ a b ⌋ b + a m o d b ) x + b y = 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 ( ⌊ a b ⌋ x + y ) + ( a m o d b ) x = gcd ( b , a m o d 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)
综合两个式子:
{ b x ′ + ( a m o d b ) y ′ = gcd ( b , a m o d b ) b ( ⌊ a b ⌋ x + y ) + ( a m o d b ) x = gcd ( b , a m o d 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 ′ − ⌊ a b ⌋ 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;
}
乘法逆元
实际上,我们求出的 x x x 被称作 a m o d b a \bmod b amodb 的逆元,记作 a − 1 a ^ {-1} a−1。当 x x x 与 b b b 互素时,存在唯一的 x x x 的逆元。当 b b b 是素数时,所有不是 b b b 的倍数的整数都有唯一的逆元。
使用乘法逆元可以帮助我们完成模意义下的除法运算:
a b ≡ a × b − 1 ( m o d p ) \frac{a}{b} \equiv a \times b ^ {-1} \pmod{p} ba≡a×b−1(modp)
欧拉函数
φ ( i ) \varphi(i) φ(i) 表示,小于等于 i i i 的正整数中,与 i i i 互质的数的个数
欧拉函数具有以下的性质:
-
φ ( p k ) = p k − p k − 1 \varphi(p^k) = p^k - p^{k - 1} φ(pk)=pk−pk−1( p ∈ P p \in \mathbb{P} p∈P)
-
欧拉函数是 积性函数,即若 gcd ( a , b ) = 1 \gcd(a, b) = 1 gcd(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):求出 n n n 的唯一分解 n = ∏ i = 1 m p i k i n = \prod_{i = 1}^{m} p_i^{k_i} n=∏i=1mpiki
根据积性, φ ( n ) = ∏ i = 1 m φ ( p i k i ) \varphi(n) = \prod_{i = 1}^{m} \varphi(p_i^{k_i}) φ(n)=∏i=1mφ(piki),根据 φ ( p k ) = p k − p k − 1 \varphi(p^k) = p^k - p^{k - 1} φ(pk)=pk−pk−1 可求
若需批量求出 φ ( n ) \varphi(n) φ(n) 可以利用到线性筛:
设 p p p 是 i i i 的最小质因子,则分三种情况:
-
i i i 是素数,则 φ ( i ) = i − 1 \varphi(i) = i - 1 φ(i)=i−1
-
p p p 为 i p \frac{i}{p} pi 的质因子,则 φ ( i ) = φ ( i p ) × p \varphi(i) = \varphi(\frac{i}{p}) \times p φ(i)=φ(pi)×p
-
p p p 为 i p \frac{i}{p} pi 互素,则 φ ( i ) = φ ( i p ) × φ ( 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;
}
}
}
}
组合计数
加法原理和乘法原理
加法原理:完成一项工作有 n n n 类方法,第 i i i 类方法下又有 a i a_i ai 类方法,那么完成这项工作总共有 ∑ i = 1 n a i \sum_{i = 1} ^ {n} a_i ∑i=1nai 种方法
乘法原理:完成一项工作有 n n n 步方法,第 i i i 步方法下又有 a i a_i ai 步方法,那么完成这项工作总共有 ∏ i = 1 n a i \prod_{i = 1}^{n} a_i ∏i=1nai 种方法
排列数
A n m A_{n}^{m} Anm 表示从 n n n 个不重复的元素中选择 m m m 个按照一定顺序排列的方案数
根据乘法原理,第一个位置有
n
n
n 种选法,第二个位置有
n
−
1
n − 1
n−1 种
选法,第三个位置有
n
−
2
n − 2
n−2 种选法,以此类推,可得:
A n m = 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!
组合数
C n m C_{n}^{m} Cnm 表示从 n n n 个不重复的元素中选择 m m m 个的方案数
根据排列数,每种方案被计算了 m ! m! m! 次,因此可得:
C n m = A n m m ! = n ! m ! ( n − m ) ! C_{n}^{m} = \frac{A_{n}^{m}}{m!} = \frac{n!}{m! (n - m)!} Cnm=m!Anm=m!(n−m)!n!
组合恒等式
根据组合数的计算方式,可以得到一系列的恒等式:
-
C n m = C n n − m C_{n}^{m} = C_{n}^{n - m} Cnm=Cnn−m
-
C n m = C n − 1 m + C n − 1 m − 1 C_{n}^{m} = C_{n - 1}^{m} + C_{n - 1}^{m - 1} Cnm=Cn−1m+Cn−1m−1(杨辉三角递推)
-
∑ i = 0 n C n i = 2 n \sum_{i = 0}^{n} C_{n}^{i} = 2 ^ n ∑i=0nCni=2n
-
( x + y ) n = ∑ i = 0 n C n i x n − 1 y i (x + y) ^ n = \sum_{i = 0}^{n} C_{n}^{i} x ^ {n - 1} y ^ i (x+y)n=∑i=0nCnixn−1yi(二项式定理)
捆绑法、插空法、隔板法
如果要求若干物品相邻,则可以将它们作为一个整体来进行计数
如果要求若干物品两两不相邻,可以先将其他物品放好,然后将
这些物品插入空当中,进行计数
通过加入隔板将问题转化,解决给相同元素分组的方案数问题
容斥原理
假设有两类元素 A A A、 B B B,总元素个数为 A A A 元素个数 + + + B B B 元素个数 − - − 既是 A A A 类也是 B B B 类的元素个数
把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去的方式被称为 容斥原理
假设有三类元素 A A A、 B B B、 C C C,总元素个数为:
∣ 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∣