《高 等 数 学》1
一部分来源于 https://codeforces.com/blog/entry/118001,感谢 Proofy!
欧拉函数
定义 \(\varphi(x) = \sum \limits_{i = 1}^x [\gcd(i, x) = 1]\)。
基础性质:
-
\(\varphi(p^k) = (p - 1)p^{k - 1}\),其中 \(p\) 是质数,\(k \ge 1\)。
-
\(\varphi(ab) = \varphi(a)\varphi(b)\) 当 \(\gcd(a, b) = 1\)。
应用
欧拉函数的基础应用是求 \(\sum \limits_{i = 1}^n \sum \limits_{j = i}^n \gcd(i, j)\)(虽然这坨东西也有不同的推法,但都要应用到欧拉函数)。
然后你暴力就可以做掉 \(n \le 10^6(O(n \log n))\),加个前缀和就可以做掉 \(n \le 10^7(O(n))\)。
注意到推这个的同时我们还推出了 \(\sum \limits_{i = 1}^n \sum \limits_{j = i}^n [\gcd(i, j) = k]\) 的快速解法。
为啥 \(\sum \limits_{i = 1}^n \frac{n}{i} = O(n \log n)\)
考虑 \(\dfrac{1}{1} + \dfrac{1}{2} + \dfrac{1}{3} + \cdots\),可以放大成 \(\dfrac{1}{1} + 2\dfrac{1}{2} + 4\dfrac{1}{4} + \cdots\),所以 \(\dfrac{1}{1} + \dfrac{1}{2} + \dfrac{1}{3} + \cdots + \dfrac{1}{n} = O(\log n)\)。
乘以 \(n\) 就是 \(O(n \log n)\)。
整除分块
Lemma 1:\(\lfloor \dfrac{n}{i} \rfloor\) 至多有 \(O(\sqrt{n})\) 个值。
证明:对于 \(i \ge \sqrt{n}\),\(\lfloor \dfrac{n}{i} \rfloor\) 至多有 \(\sqrt{n}\) 个值,再加上 \(i < \sqrt{n}\),总共 \(O(\sqrt{n})\)。
Lemma 2:设 \(l\) 是最小的 \(x\) 满足 \(\lfloor \dfrac{n}{x} \rfloor = c\),\(r\) 是最大的 \(x\) 满足 \(\lfloor \dfrac{n}{x} \rfloor = c\),则 \(r = \lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor\)。
然后你就可以用这两个 Lemma 去写题了。
exgcd
假设 \(ax_1 + by_1 = \gcd(a, b), bx_2 + (a \bmod b)y_2 = \gcd(b, a \bmod b)\)
显然有 \(ax_1 + by_1 = bx_2 + (a \bmod b)y_2\)。
变换一下,有 \(ax_1 + by_1 = bx_2 + (a - b \lfloor \dfrac{a}{b} \rfloor)y_2\)
\(ax_1 + by_1 = bx_2 + ay_2 - b \lfloor \dfrac{a}{b} \rfloor y_2\)
\(ax_1 + by_1 = ay_2 + b(x_2 - \lfloor \dfrac{a}{b} \rfloor y_2)\)
得到 \(x_1 = y_2, y_1 = x_2 - \lfloor \dfrac{a}{b} \rfloor y_2\)。
然后你就可以用这个玩意求 \(ax+by = \gcd(a, b)\) 的解了。

浙公网安备 33010602011771号