#miaorain001. CSP初赛 数学专题 炒鸡通俗版

CSP初赛 数学专题 炒鸡通俗版

No testdata at current.

CSP初赛 数学专题 炒鸡通俗版

由于猫鱼实在无法忍受原文字母满天飞,导致谁来了也在看天书,故编撰本文
猫鱼编 [github] [黑猫OJ] [homepage(敬请期待)]

整除

定义abZa,b ∈ Zb0b ≠0。如果有一个整数 qq,使得 a=bqa=bq,则 aa 叫做 bb 的倍数,bb 叫做 aa 的因数。或者说 bb 能整除 aa 或者 aa 能被 bb 整除,记作 bab | a
如果 bb 不能整除 aa,记作 bab ∤ a

定义
aa ÷÷ bb == xx ······ 00, 或者说 aa % bb ==== 00
aa 能被 bb 整除。记作 bb | aa

叫做“ a 能被 b 整除 ” “b 能整除 a ”。注意区分标记处的顺序!
反之,不能整除,记作 bab ∤ a
aa, bb, xx 均为整数,且b0b ≠ 0

引理1:
abcZa,b,c ∈Z ,而 abbca | b,b | c,则 aca | c
证:b=aq1b = aq_1c=bq2c = bq_2c=a(q1q2)c=a(q_1q_2)

引理1:整除的传递性(四种表述)
bb 能被 aa 整除,cc 能被 bb 整除,则 cc 能被 aa 整除。
aa 能整除 bbbb 能整除 cc ,则 aa 能整除 cc
bb % aa == 0 and cc % bb == 0,则cc % aa == 0。
aa ÷ bb = 一个整数 ····· 0,cc ÷ bb = 一个整数 ····· 0,则cc ÷ aa = 一个整数 ······ 0
( aa, bb, cc 均为整数,且 a0a≠0b0b≠0 )

写成符号语言:
aabbbbcc,则 aacc

证明:
因为 aa 能整除 bb,则有 b=a×kb=a×k ①,其中 kk 是整数。
因为 bb 能整除 cc,则有 c=b×mc=b×m ②,其中 mm 是整数。
① 代 ②,c=a×k×mc=a×k×m
kkmm 均为整数,所以 k×mk×m 也为整数,所以: c=a×c = a × 一个整数
显然 aa 能整除 cc

引理2:
证: abZa,b ∈Z,若 a<b|a| < |b|ba|b| | |a|,则 a=0a=0
如果 a>00<a<ba=bq|a|>0,0<|a|<|b|,|a|=|b|q,如果 q>0q>0,由于 qZq ∈ Zq1q ≥1
ab|a| ≥|b|,与 a<b|a|<|b| 矛盾,所以 a=0|a|=0

引理2:
一个整数无法被比它更大的数整除,00 除外。

证明:
显而易见。如需请自行理解原文。

引理3:
带余除法:若 abZb0a,b ∈Z,b≠0,则一定有且只有两个整数 qrq,r,使得 a=bq+ra = bq+r0r<b0 ≤r<|b|
证:
1. 存在有一个整数 qq,使得 a=bqa=bq,故 r=0r=0,本引理成立。
2. a=bq+ra = bq+r0r<b0 ≤r<|b| 式子1
假设还有另外一对 a=bq1+r1a=bq_1+ r_10r1<b0 ≤r_1<|b| 式子2
两式相减,0=b(qq1)+(rr1)0=b(q- q_1)+(r - r_1) 式子3
brr1|b| | | r - r_1 |
rr1<b| r - r_1 |<|b|
rr1=0r - r_1=0
r=r1r = r_1
由式子3 和 b0q=q1b≠0 ⇒ q =q_1

引理3:带余除法(小学课本知识,可忽略)
任意整数 aa 除以非零整数 bb,总能写出 唯一的 带余除法算式:

a÷b=cd(0d<c,即余数小于商,cd均为整数)a ÷ b = c ······ d\quad (0 ≤ d < |c|,即余数小于商,c,d 均为整数)

此时:

a=b×c+da = b \times c + d \quad

证明:
显而易见。如需请自行理解原文。

质数与合数

编者注:这是为数不多原文就写的很明白的了,如果这都看不懂,就给我边蛙跳边背诵!
注意,只有大于1的正整数才有质数合数之分!!

定理:一个大于 11 的正整数,只能被 11 和自身整除,不能被其他正整数整除,这样的正整数叫做质数。
一个正整数,除了能被 11 和自身整除外,还可以被其他的正整数整除,这样的正整数叫做合数。
如果一个正整数 aa 有一个因数 bb,而 bb 又是质数,则 bb 就叫做 aa 的质因数。
全体正整数可以分为 3 类:

  1. 整数 11 (编者注:所以1既不是质数也不是合数)
  2. 全体质数
  3. 全体合数

引理:如果 aa 是一个大于 11 的整数,则 aa 的大于 1 的最小因数一定是质数。
证:
1.如果 aa 是一个质数,aa 的大于 11 的因数只有一个,就是 aa,结论成立。
2.如果 aa 是一个合数,除 11aa 之外,aa 还有其他正因数,假设 bb 是这些正因数中最小的,假定 bb 是合数,一定有 1<c<b1<c<bcbc|bbab|a,即 cac|a,与假设矛盾。
此引理说明了:任何大于 11 的整数都至少有一个质因数。

质因数分解

参考程序:

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    for (int i = 2; i <= n; i++) {
        if (n % i == 0) {
            cout << n / i << endl;
            break;
        }
    }
        
	return 0;
}

引理:如果 aa 是一个大于 11 的整数,而所有 ≤a\sqrt{a} 的数都除不尽 aa,则 aa 是质数。

质数个数定理:定义 π(x)π(x) 为不大于 xx 的质数的个数,limnπ(x)xlogx=1\lim\limits_{n\to\infty} \frac{π(x)}{\frac{x}{logx}}=1

随着数的增大,质数的密度逐渐降低,且大约xlnx\frac{x}{\ln x} 个数后有一个质数。
或者说,若随机选取一个不超过 xx 的整数,它是质数的概率1lnx\frac{1}{\ln x}
注意!约为!!!

筛法求质数

朴素筛法:枚举 22nn 的每个数 ii,将 2i3i2i,3i,··· 均标记为合数; 枚举完后仍没有被标记的数即为质数。

image

时间复杂度:O(i=1nni)=O(nlogn)O(\sum\limits_{i=1}^n \frac{n}{i})=O(nlogn)
简要证明:调和级数前 nn 项和 logn≈logn

f(n)=i=1n1i=(11)+(12+13)+(14+15+16+17)+...f(n)=\sum\limits_{i=1}^n \frac{1}{i}=(\frac{1}{1})+(\frac{1}{2}+\frac{1}{3})+(\frac{1}{4}+\frac{1}{5}+\frac{1}{6}+\frac{1}{7})+...

vector<int> get_primes(int n){
	vector<int> v;	
    for(int i = 2; i <= n; i++){
    	if(!book[i]) v.push_back(i);
        
        for(int j = 2 * i; j <= n; j += i)
            book[j] = true;
    }
    return v;
}

埃式筛法:(Eratosthenes筛法)只有质数才可能标记后面的合数。
image
时间复杂度:O(nloglogn)O(nloglogn)

vector<int> get_primes(int n){
	vector<int> v;	
    
    for(int i = 2; i <= n; i++){
    	if(!book[i]) {
            v.push_back(i);
            
            for(int j = 2 * i; j <= n; j += i)
            	book[j] = true;
        } 
    }
    
    return v;
}

欧拉筛法:(线性筛法)设 xx 的最小质因数为 dd,则 xx 只会被 xd\frac{x}{d} 标记。
image
时间复杂度 O(n)O(n)
当枚举到 ii 时,假设当前已经求出质数为 P1P2PkP_1,P_2,… P_k,而 ii 的最小质因数为 PmP_m,则对于所有的 x[1,m]x∈[1,m]PxiP_x i 的最小质因数就是 PxP_x,故用 ii 标记 PxiP_x i

vector<int> get_primes(int n){
	vector<int> v;
  	for(int i = 2; i <= n; i++){
    	if(!book[i]) v.push_back(i);
      	for(int j = 0; v[j] <= n / i; j++){
        	book[v[j] * i] = true;
          	if(i % v[j] == 0) break;
        }
    }
  	return v;
}

最大公约数

定义:如果 nZn ∈Zn2n ≥2,而 a1a2anda_1,a_2,⋅⋅⋅,a_n,d 都是正整数,又设 da1da2dand|a_1,d|a_2⋅⋅⋅d|a_ndd 叫做 a1a2ana_1,a_2,⋅⋅⋅,a_n 的公约数,公约数中最大的一个叫做最大公约数,最大公约数是其他所有公约数的倍数,记作 (a1a2an)=d(a_1,a_2,⋅⋅⋅,a_n)=d

定义
一组正整数 a1,a2,...,ana_1,a_2,...,a_n 的共同约数(公约数)是指:

  • 能同时整除所有这些数的正整数 dd
  • 最大公约数(GCD)是这些公约数中最大的那个,记作gcd(a,b)
  • g根据定义,显然 gcd(a,b)=gcd(b,a)gcd(a,b) = gcd(b,a)
  • *最大公约数能被所有其他公约数整除

符号表示
dda1,a2,...,ana_1,a_2,...,a_n 的公约数 ⇨ da1d|a_1da2d|a_2 且 ... 且 dand|a_n
最大公约数记为 (a1,a2,...,an)=d(a_1,a_2,...,a_n) = d

引理: aba,b 都是正整数,且 a>ba>ba=bq+ra=bq+r0<r<b0<r<b ,其中 qqrr 都是正整数,则 aabb 的最大公约数等于 bbrr 的最大公约数,即 (a,b)=(b,r)(a,b)=(b,r)

引理(这就是辗转相除法)
辗转相除法:求a与b的最大公因数:
a ÷ b = c ······ d,
重复用其除数(b)除以余数(d)。
直到余数为0,对应除法算式中的除数即为最大公因数

直观理解
假设要找 28 和 16 的最大公约数:

  1. 28 ÷ 16 = 1 余 12 → 转化为找 (16, 12)
  2. 16 ÷ 12 = 1 余 4 → 转化为找 (12, 4)
  3. 12 ÷ 4 = 3 余 0 → 找到 GCD 为 4
int gcd(int a, int b){
    return b ? gcd(b, a % b) : a;
}

复杂度为 O(log(max(a,b))O(log(max(a,b))
由于任何正整数都是 0000 的公约数,故 gcd(0,0)gcd(0, 0) 不存在。
对任意正整数 aa,有 gcd(0,a)=agcd(0, a) = a

二进制算法:不断去除因子 22 来降低常数。

int gcd(int a, int b){
    #编者注:这东西真的有学它的意义吗?他时间复杂度跟辗转相除法一样欸!
    #有背它的功夫,怎么不背我找到的进制转化极简模板?
	if(a == b) return a;
	if(a < b) return gcd(b, a);
	if(a % 2 == 0 && b % 2 == 0) return 2 * gcd(a / 2, b / 2);
	if(a % 2 == 0 && b % 2) return gcd(a / 2, b);
	if(a % 2 && b % 2 == 0) return gcd(a, b / 2);
	if(a % 2 && b % 2) return gcd(b, a - b);
}

最小公倍数

a,ba,b 为正整数,mm 为非负整数,若 ama | mbmb | m,则称 mmaabb 的公倍数。

定义

  • 对于两个正整数 aabb,它们的 公倍数 是能同时被 aabb 整除的数(例如:12 和 18 的公倍数有 36, 72, 108...)
  • 最小公倍数(LCM) 是所有公倍数中最小的正数(比如 36 是 12 和 18 的最小公倍数),记作 lcm(a,b)\text{lcm}(a, b)
  • 显然,lcm(a,b)=lcm(b,a)lcm(a,b)= lcm(b,a)

lcm和gcd关系:lcm(a,b)=abgcd(a,b)lcm(a,b)=\frac{ab}{gcd(a,b)}
需要注意的是,在实际的代码实现中,为避免中间结果的溢出,应该使用 a/gcd(a,b)ba/gcd(a,b)*b,而不是 ab/gcd(a,b)a*b/gcd(a,b)

算数基本定理(唯一分解定理)

n2n≥2 为整数,则有唯一的分解式:n=i=1mPiαin = \prod\limits_{i=1}^m {P_i}^{\alpha_i},其中 P1<P2<...<PmP_1<P_2<...<P_mPiP_i 为质数,αi\alpha_i 为正整数。

编者注:我*这是啥呀,门?

任何一个合数,都可以拆成质数的乘积。
拆出的算式是唯一的。(不考虑顺序)

比如:

12=2×2×3=22×312 = 2×2×3 = 2^2×3

编者注:其与哥德巴赫猜想的区别

哥德巴赫猜想:每一个大于2的偶数是两个质数的

10=3+7=5+510 = 3 + 7 = 5 + 5

哥德巴赫猜想:任一大于 7 的奇数都可以写成三个 质数之

13=3+5+513 = 3 + 5 + 5

唯一分解定理:任何一个合数,都可以拆成质数的个数不限(为大于0的整数)

12=2×2×3=22×312 = 2×2×3 = 2^2×3


唯一分解定理是乘积,两种哥德巴赫猜想是
唯一分解定理分解结果个数不限,两种哥德巴赫猜想有个数要求。 </b>



证明(慎点,慎看,已无法简化)
  1. 反证法起点:假设存在无法分解为质数乘积的最小整数 nn
  2. 性质分析
    • nn 不能是质数(否则自身即分解式 n=nn = n
    • nn 必为合数,可表示为 n=a×bn = a \times b1<a,b<n1 < a, b < n
  3. 矛盾推导
    • 由于 a,b<na, b < n,根据假设它们都可分解为质数乘积
    • 因此 n=a×bn = a \times b 本身也能分解为质数乘积,与假设矛盾
    • 结论:所有 n2n ≥ 2 均可质因数分解

唯一性证明(为什么分解唯一?)

  1. 反证法起点:假设存在两种不同分解形式:

    n=p1p2pr=q1q2qsn = p_1 p_2 \dots p_r = q_1 q_2 \dots q_s

  1. 欧几里得引理应用
    • 质数 p1p_1 整除右边乘积 ⇒ p1p_1 必整除某个 qjq_j
    • 由于 qjq_j 是质数 ⇒ p1=qjp_1 = q_j
  2. 递推消去
    • 将两边相等的质数 p1=qjp_1 = q_j 约去,得到更小的数 nn'
    • 重复此过程,最终所有质因子必须一一对应
  3. 矛盾结论
    • 若分解不唯一,则存在更小的数 nn' 满足矛盾条件
    • nn 是"最小反例"的假设矛盾 ⇒ 唯一性得证 </b>

约数个数定理

nn 的约数个数 d(n)=i=1m(αi+1)d(n) = \prod\limits_{i=1}^m (\alpha_i+1)
例如:28=22×728=2^2 \times 7
d(28)=(2+1)×(1+1)=6d(28)=(2+1) \times (1+1)=6

编者注:服了,又给我画扇门

如何计算一个数因数的个数?

  1. 第一步:把数分解成质数相乘的形式
    (例如:28 = 2×2×7 = 2²×7¹)

  2. 第二步:每个质数的右上角数字(指数)加1,再相乘
    • 2² → 指数是2 → 2+1=3
    • 7¹ → 指数是1 → 1+1=2
    • 总数 = 3×2=6个因数(实际是1,2,4,7,14,28)

为什么这样计算?

  • 质数2有3种选择:用0次(2⁰=1)、1次(2¹=2)、2次(2²=4)
  • 质数7有2种选择:用0次(7⁰=1)、1次(7¹=7)
  • 所有组合方式共有3×2=6种,对应6个因数

约数和定理
nn 的所有因数之和为:

S(n)=(1+p1+p12++p1α1)(1+p2+p22++p2α2)S(n) = (1+p_1+p_1^2+\dots+p_1^{\alpha_1})(1+p_2+p_2^2+\dots+p_2^{\alpha_2})\dots

示例S(28)=(1+2+4)(1+7)=56S(28) = (1+2+4)(1+7) = 56


通俗解释
如何计算所有因数的和?

  1. 第一步:对每个质数的各次幂求和
    • 对2²:1+2+4=71+2+4 = 7
    • 对7¹:1+7=81+7 = 8

  2. 第二步:把这些和相乘
    7×8=567 \times 8 = 56(实际因数1+2+4+7+14+28=56)

    为什么这样计算?
    通过展开乘积可以得到所有组合:

(1+2+4)(1+7)=1×1+1×7+2×1+2×7+4×1+4×7(1+2+4)(1+7) = 1×1 + 1×7 + 2×1 + 2×7 + 4×1 + 4×7


这正好对应所有因数:1,7,2,14,4,28

更多例子验证

质因数分解 因数个数计算 实际因数 因数和计算 实际和
6 2¹×3¹ (1+1)(1+1)=4 1,2,3,6 (1+2)(1+3)=12 12
12 2²×3¹ (2+1)(1+1)=6 1,2,3,4,6,12 (1+2+4)(1+3)=28 28
30 2¹×3¹×5¹ (1+1)(1+1)(1+1)=8 1,2,3,5,6,10,15,30 (1+2)(1+3)(1+5)=72 72

裴蜀定理

对于不定方程 ax+by=max+by=m, 其有解的充要条件 gcd(a,b)mgcd(a,b) | m

不定方程的定义:
  1. 未知数的个数多于方程个数
  2. 未知数受到条件要求(如要求是有理数、整数或正整数等等)

当方程 ax+by=max + by = m(其中a,b,ma,b,m是整数已知数)存在整数解时
gcd(a,b)mgcd(a,b) | m,或者说mm %\% gcd(a,b)==0gcd(a,b) == 0


重要推论:当 aabb 互质时,aabb 的整系数线性组合可以得到所有的整数。

aabb互质,即gcd(a,b)=1gcd(a,b) = 1时,ax+byax + by可以等于任意整数

  • 例如:3x+2y3x + 2y可以等于1(取x=1,y=-1)、-1、5等所有整数

符号语言:
gcd(a,b)=1\gcd(a,b)=1时,对任意整数mm,存在整数x,yx,y使ax+by=max + by = m