zyc数论讲稿
数论进阶
zyc070419 2025.7.15
目录
- 不知道放到哪里的知识
- 费马小定理 欧拉定理
- 逆元
- 原根
- 中国剩余定理
- Lucas定理,Kummer定理
- 欧拉筛
- 数论杂题
- 数论前缀和
- 数论分块
- 积性函数
- 狄利克雷卷积 狄利克雷前缀和
- 常见数论函数
- 莫比乌斯反演
- 杜教筛
- Min_25筛
不知道放到哪里的知识
费马小定理
对于质数 \(p\) 和与 \(p\) 互质的正整数 \(a\),满足:
欧拉函数
记 \(\varphi(n)\) 表示不超过 \(n\) 的正整数中与 \(n\) 互质的数的个数,例如: \(\varphi(1)=1;\forall p\in \text{prime},\varphi(p)=p-1\)。
更一般地,有:
证明可以用容斥做。
(扩展)欧拉定理
欧拉定理(\(a\) 与 \(p\) 互质):
扩展欧拉定理:
逆元
若对于质数 \(p\),\(a\times b\equiv 1\pmod{p}\),那么记 \(b\equiv a^{-1}\pmod{p}\),即 \(b\) 是 \(a\) 的逆元。
逆元的三种求法:
-
费马小定理:\(a^{-1}\equiv a^{p-2}\pmod{p}\)。
-
裴蜀定理:\(a\times b+k\times p=1\),解出 \(b\) 的一般解即可。
-
线性递推:记
inv[n]
为 \(n\) 在模 \(p\) 意义下的逆元,那么有递推公式:inv[n]=1ll * (p - p / n) * inv[p % n] % p
。
主要用第一种第三种。
原根
在模意义取对数时使用。
对于正整数 \(n\),若 \(g\in [1,n-1]\cap \mathbb{N}^*,\gcd(g,n)=1\),且 \(g^0,g^1,\cdots g^{\varphi(n)-1}\) 在模 \(n\) 意义下互不相同,则称 \(g\) 是 \(n\) 的一个原根。
原根有 \(\varphi(\varphi(n))\) 个,密度很大,所以最小原根很小,可以暴力枚举并 check。check 方法是:
原根满足 \(\forall p\in \text{prime},p|\varphi(n),g^{\varphi(n)/p}\not\equiv 1\pmod{n}\)。
中国剩余定理
解决如下问题,求出该同余方程组的通解:
其中 \(b_1,b_2\cdots,b_n\) 两两互质。
记 \(M=\prod_i b_i\),然后令:
则 \(x\equiv\sum_{i=1}^{n}a_iM_it_i\pmod{M}\)。
扩展中国剩余定理
依然是上面的问题,但不保证 \(b_i\) 两两互质。
一次考虑每个方程组,记 \(L_i=\operatorname{lcm}_{j=1}^i b_j\),记考虑了前 \(i\) 个方程组后的通解满足 \(x\equiv v_i\pmod{L_i}\),现在考虑第 \(i+1\) 个方程,即解决这个问题:
也即 \(x=k_1L_i+v_i=k_2b_{i+1}+a_{i+1}\),即:
裴蜀定理即可。如何解?口述。
(ex)Lucas 定理
当 \(p\) 是质数时:
ex 没见到用过。大家自学。
Kummer 定理
\(\dbinom{n+m}{n}\) 含 \(p\) 的次数等价于 \(n+m\) 在 \(p\) 进制下相加需要进位的次数。
好用的例子:\(\binom{n+m}{n}\) 含 \(2\) 的次幂为 \(\operatorname{popcount}(n\operatorname{and} m)\)。
欧拉筛
核心思想:\(n=p(n)\times \dfrac{n}{p(n)}\),其中 \(p(n)\) 为 \(n\) 的最小质因子。即:用每个数的最小质因子来筛 \([1,N]\) 的每个数。
数论杂题
一些为了让上面的知识显得更有用的题目
P4774 [NOI2018] 屠龙勇士
很难形式化,不如看看原题面。
exCRT 板子。
筛 \(i^k\)
给定 \(k,T\)。接下来进行 \(T\) 次询问,每次询问给出一个数 \(x\),求 \(x^k\mod 998244353\)。
\(1\le x,k\le 10^8\),\(1\le T\le 10^6\)。
类似的,筛 \(\varphi(n)\)。
P4139 上帝与集合的正确用法
定义 \(a_0=1,a_n=2^{a_{n-1}}\),可以证明 \(b_n=a_n\bmod p\) 在某一项后都是同一个值,求这个值。
发现:\(\varphi(n)\) 迭代 \(\mathcal{O}(n)\) 次就会变成 \(1\),所以暴力算即可。
具体到时候讲。
P9007 [入门赛 #9] 最澄澈的空与海 (Hard Version)
我们会给你 \(T\) 组数据,每组数据包括一个正整数 \(n\)。
对于每组数据,请你帮助求出满足以下条件的整数三元组 \((x, y, z)\) 的组数:
- \(x \geq 0\),\(z \geq 1\)。
- \(x - y \div z = n!\) 且 \((x - y) \div z = \dfrac{n!}{n}\)。
由于答案可能过大,因此你需要输出答案对 \(998244353\) 取模后的结果。
不难注意到答案有可能为 \(\infty\),这时请按照「输出格式」要求进行处理。
请注意此处应满足 \((x - y) \div z = \dfrac{n!}{n}\) 而不是 \(= n\)。
请注意这里的 \(\div\) 不是向下取整的整除,这显然意味着你需要保证 \(y \div z\) 和 \((x - y) \div z\) 为整数。
三个未知量,两个限制——解方程。
易得,符合题意的充要条件为 \(z|(n-1)\times (n-1)!\)。
也即,题目要求回答 \((n-1)\times (n-1)!\) 的约数个数。这是好求的。
P2480 [SDOI2010] 古代猪文
给出 \(g,n\),求:
首先,可以欧拉定理,转化为求:
右面是一个合数,不妨质因数分解,发现:
数量很少,而且都不大。怎么利用?
中国剩余定理!本体等价于求 \(x\),满足:
惊人地发现,可以 Lucas。然后就做完了。
P2350 [HAOI2012] 外星人
艾莉欧在她的被子上发现了一个数字 \(N\),她觉得只要找出最小的 \(x\) 使得,\(\varphi^x(N) = 1\)。根据这个 \(x\) 她就能找到曾经绑架她的外星人的线索了。当然,她是不会去算,请你帮助她算出最小的 \(x\)。
首先观察可以发现:
操作等价于对于这个数 \(x\) 的每种质因数各取出一个,减一,乘回去。
那么也就是说:除了 \(2\) 以外,对于其他质因数,你操作一次至少生成一个 \(2\)。而 \(2\) 会生成 \(1\)。
换句话说,迭代过程中的那个数 \(x\) 为 \(2\) 的倍数的轮数是一个区间。更进一步的,是一个后缀。
更进一步的——如果 \(x\) 一开始就是 \(2\) 的倍数,那么到结束为止他一直是 \(2\) 的倍数;如果不是,那么从第二次迭代开始他就是 \(2\) 的倍数。
所以这题等价于求所有质因数能够变成多少个 \(2\),每个质因数是独立的,即这是一个“加性函数”。dp 即可。
数论函数前缀和
一些求和。
数论分块
\(S=\{x|x=\lfloor\dfrac{n}{d}\rfloor,d\in\mathbb{N}^*,d\le n\}\)。则 \(|S|\) 的大小为 \(\mathcal{O}(\sqrt{n})\) 级别。
证明略。
举例:求 \(\sum_{i=1}^{n}\lfloor\dfrac{n}{i}\rfloor\),代码如下:
int res = 0;
for (int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
res += (r - l + 1) * (n / l);
}
printf("%d\n", res);
积性函数
-
完全积性函数:\(\forall x,y,f(x)\times f(y)=f(xy)\),则 \(f(x)\) 为完全积性函数。
-
积性函数:\(\forall x,y,\gcd(x,y)=1,f(x)\times f(y)=f(xy)\),则 \(f(x)\) 为积性函数。
一些常见数论函数
首先记 \(n=\prod_{i=1}^{m} p_i^{c_i}\)。
狄利克雷卷积
有三个数论函数 \(f(x),g(x),h(x)\),其中 \(h(n)=\sum_{d|n}f(d)g(\dfrac{n}{d})\),则记 \(h=f*g\)。
若 \(f,g\) 均为积性函数,则 \(h\) 也是积性函数。
狄利克雷卷积满足交换律,结合律,分配律。
一些恒等式:
P5495 【模板】Dirichlet 前缀和
给定一个长度为 \(n\) 的数列 \(a_1,a_2,a_3,\dots,a_n\)。
现在你要求出一个长度为 \(n\) 的数列 \(b_1,b_2,b_3,\dots,b_n\),满足
由于某些神秘原因,这里的 \(b_k\) 要对 \(2^{32}\) 取模。
是否会 \(\mathcal{O}(n\log n)\)?
高维前缀和优化。复杂度 \(\mathcal{O}(n\log\log n)\)。
莫比乌斯反演
若 \(F=G*I\),则 \(G=F*\mu\)。推导:
所以我们就有了一个更深的理解:
对于每个质数,\(I\) 是函数前缀和,\(\mu\) 是函数差分。
到此为止的一些题目
放一些例题看看吧。
求:
题面不粘了。
题目转化为求:
那么只要求(不妨令 \(n\le m\)):
其中 \(f=\mu * Id=\varphi\)。可以线性筛。也可以不线性。
所以数论分块+筛即可。
另一种方法:
求:
\(1\le n,A_i\le 5\times 10^4\)
记 \(c_i\) 表示 \(A_j=i\) 的 \(j\) 的数量。记 \(M=5\times 10^4\)。
暴力枚举就能过。
求:
\(1\le n\le 5\times 10^6\),\(1\le k \le 10^{18}\)。
待定讲不讲。
给一个 \(n\times m\) 的网格,左下角点的坐标为 \((1,1)\),右上角为 \((n,m)\),求所有格点三角形(三个顶点都在格点上)上格点个数之和。答案对 \(998244353\) 取模。
多测。
题解链接:https://www.cnblogs.com/zyc070419-blog/p/18982213
求:
多测,\(T\) 组询问。
\(1\le T,n,m\le 5\times 10^4\)
多测。求:
\(1\le T\le 10^4,1\le n,m\le 10^5\)
推导。数据分治。
杜教筛
求:\(S(n)=\sum_{i=1}^nf(n)\)。\(f\) 为数论函数。
如果我们有另一个数论函数 \(g\),并有 \(h=f*g\),那么:
所以:
假如 \(g,h\) 的前缀和都能 \(\mathcal{O}(1)\) 求出,那么 \(S(n)\) 就能较快的求出。并且对于一个固定的 \(n\),能直接求出所有 \(S(\lfloor n/k\rfloor)\)。
经过一些积分发现预处理所有 \(S(m),m\le n^{2/3}\) 最快,这样复杂度就是 \(\mathcal{O}(n^{2/3})\) 的。
杜教筛的核心就是完美地构建卷积。
求:
多测。
\(1\le T\le 10\),\(1\le n< 2^{31}\)。
根据这个算就行。
求:
杜教筛即可。
求:
\(1\le n\le 10^5,1\le m\le 10^9\)。
记:
则:
感觉可以递归,但这样子搞递归效果并不好,所以换一下:
复杂度 \(\mathcal{O}(\text{能过})\)。类似于杜教筛。
Min_25 筛
讲吗?讲吗?讲吗?
谢谢大家!