普及数论题

· · 个人记录

这次补的是之前的笔记。

含有算法介绍

Chapter I 除法

大家都知道小学除法罢。除非你幼儿园大班就考CSP提高

小学除法长这样:n \div p =k \dots r

但是OI常用的带余除法,也就是欧几里得除法,长这样: n=p\times k+r

该除法具有:

给定整数 n(被除数)和非零整数 p (除数),存在唯一的整数 k (商) 与 r(余数),其中 0\le r < |p|

其中k=\left\lfloor\dfrac{n}{p}\right\rfloor , r = n \mod p

\mathsf{{\color{red}\colorbox{white}{请注意}}} \mathsf{{\color{red}\colorbox{white}{C/C++中整数类型的除法}}} \mathsf{{\color{red}\colorbox{white}{也就是/运算符}}} \mathsf{{\color{red}\colorbox{white}{是向0取整而非向下取整}}}

例如:-5/3向下取整=-2,向零取整=-1

那%是啥意思?a%b等价于a膜拜b?

c++中的%为取模运算

在c++中,%运算符的运行规则为取余

两数取余,结果符号看被除数

e.g.

5%3=2
5%-3=2
-5%3=-2
-5%-3=-2

所以在取模的时候不需要考虑除数的正负情况。但请注意防爆和题目限制

  1. 有些时候题目的玄学限制可能会导致%一个负数的答案仍然是错的

  2. 小心类型溢出

  3. 当式子里出现减法运算或各个参数/变量中有负数的时候,参考第一条,万分小心,同时注意这个参数/变量的正负是否会影响其他的因素。

int gcd(int a,int b){
    if(b==0){
        return a;
    }
    else{
        return gcd(b,a%b);
    }
}
gcd(12,-8)=4
gcd(-12,8)=-4
gcd(-12,-8)=-4
gcd(8,-12)=-4
gcd(-8,12)=4
gcd(-8,-12)=-4

你猜对了吗?真聪明!清华北大不是梦

Chapter II 整数唯一分解定理

任意 \ge 1 的自然数 n 都可以唯一地分解为有限个质数的乘积。

n = p_1^{r_1} \times p_2^{r_2} \times \dots \times p_k^{r_k} = \prod\limits_{i=1}^{k} p_i^{r_i}

其中 p_1 < p_2 < \dots < p_kr_i 为正整数

上述式子也被称为n的标准分解式

这个定理可以把对自然数的研究转换成对质数的研究,且不需要分类讨论——因为是唯一的。

gcd和lcm在整数唯一分解定理中的应用

\gcd(a,b) = p_1^{\min(r_{a_1},r_{b_1})} \times p_2^{\min(r_{a_2},r_{b_2})} \times \dots \times p_k^{\min(r_{a_k},r_{b_k})}

lcm (a,b) = p_1^{\max(r_{a_1},r_{b_1})} \times p_2^{\max(r_{a_2},r_{b_2})} \times \dots \times p_k^{\max(r_{a_k},r_{b_k})}

公式太大,只能开大标题了

欧拉函数的定义详见这里的Chapter IV

d_n = (r_1+1)\times (r_2+1)\times \dots (r_k+1)

\sigma_n = (1 + p_1 + p_1^2 + \times + p_1^{r_1}) \times (1 + p_2 + p_2^2 + \times + p_2^{r_2}) \times (1 + p_n + p_n^2 + \times + p_n^{r_n})

分解质因数的方法

方法1

利用性质:

流程:

时间复杂度:O(\sqrt{n})

适用范围:

优点:

缺点:

方法2

利用性质:

流程:

时间复杂度: O(\sqrt{n})/O(\dfrac{\sqrt{n}}{\log n })

适用场景:

优点:

缺点:

关于线性筛法:

时间复杂度分析在这里的Chapter V

代码在这里的Chapter I

线性筛思路:

方法3

利用性质:

流程:

时间复杂度:O(n)/O(\log n)

适用场景:

优点:

缺点:

方法4

Phollard-Rho算法

同样随机化的素数检测算法是Miller-Rabin

找约数

问题:如何高效地找到 n 的所有约数

\displaystyle d | n \Rightarrow \frac{n}{d} | n

方法1

利用性质:

流程:

时间复杂度: O(\sqrt n)

适用场景:

优点:

缺点:

方法2

利用性质:

流程:

时间/空间复杂度:O(n\log n)

适用场景:

优点:

缺点:

方法3

利用性质:

流程:

适用范围:

优点:

缺点:

找约数

一些算法的复杂度与 d_n 相关,分析复杂度的时候需要分析:

\max\limits_{x=1}^{n} d_x

上述式子取得最大值的最小 x 被称为反素数

Chapter III 线性筛总结

通过线性筛预处理数论函数,需要处理两个基本问题

能正确求出数论函数的条件:每种不同的质因子贡献独立

复杂度线性的条件:添加一个质因子时,函数值能够快速递推