「洛谷 P2257」YY 的 GCD - 莫比乌斯反演
题意描述
给定 \(N, M\),求 \(1 \leq x \leq N\),\(1 \leq y \leq M\) 且 \(\gcd(x, y)\) 为质数的 \((x, y)\) 有多少对。
数据范围:\(T = 10^4\),\(N, M \leq 10^7\)。
解题思路
本题要求求下列式子的值(\(\text{Primes}\) 为质数集合):
\[ \sum_{x = 1}^n{ \sum_{y = 1}^m{[\gcd(x, y) \in \text{Primes}]} } \]
看到单元函数我们可以尝试用莫比乌斯反演化简。
我们设函数 \(A(n, m) = \sum_{x = 1}^n{ \sum_{y = 1}^m{[\gcd(x, y) \in \text{Primes}]} }\),进行一些化简即可得 \(A(n, m) = \sum_{ k \in \text{Primes} }{ \sum_{x = 1}^n{ \sum_{y = 1}^m{[\gcd(x, y) = k]} } }\),显然 \(A(n, m)\) 即为答案。
对于 \(A(n, m)\) 这个函数的整体不好化简,我们可以先把 \(A(n, m)\) 拆出来。我们设下列函数:
\[ f(k) = \sum_{x = 1}^n{ \sum_{y = 1}^m{[\gcd(x, y) = k]} } \]
显然 \(A(n, m) = \sum_{k \in Primes}{f(k)}\),故问题转化成了化简 \(f(k)\)。
我们可以尝试用莫比乌斯反演化简 \(f(k)\)。设下列函数:
\[ \begin{align*} F(k) &= \sum_{k | d}{f(d)} \\ &= \sum_{k | d}{ \sum_{x = 1}^n{ \sum_{y = 1}^m{[\gcd(x, y) = d]} } } \\ &= \sum_{t = 1}^{\min\{ \lfloor \frac{n}{k} \rfloor , \lfloor \frac{m}{k} \rfloor \} }{ \sum_{x = 1}^n{ \sum_{y = 1}^m{[\gcd(x, y) = tk]} } } \\ &= \sum_{x = 1}^n{ \sum_{y = 1}^m{[k | \gcd(x, y)]} } \\ &= \sum_{x = 1}^n{ \sum_{y = 1}^m{[k | x][k | y]} } \\ &= \lfloor \frac{n}{k} \rfloor \lfloor \frac{m}{k} \rfloor \end{align*} \\ \]
由于 \(F(k) = \sum_{k | d}{f(d)}\),我们可以进行莫比乌斯反演:
\[ \begin{align*} f(k) &= \sum_{k | d}{ \mu(\frac{d}{k}) F(d) } \\ &= \sum_{k | d}{ \mu(\frac{d}{k}) \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor } \\ &= \sum_{t = 1}^{ \min\{ \lfloor \frac{n}{k} \rfloor , \lfloor \frac{m}{k} \rfloor \} }{ \mu(t) \lfloor \frac{n}{tk} \rfloor \lfloor \frac{m}{tk} \rfloor } \end{align*} \]
于是我们可以得出:
\[ A(n, m) = \sum_{k \in Primes}{ \sum_{t = 1}^{ \min\{ \lfloor \frac{n}{k} \rfloor , \lfloor \frac{m}{k} \rfloor \} }{ \mu(t) \lfloor \frac{n}{tk} \rfloor \lfloor \frac{m}{tk} \rfloor } } \]
但现在直接求 \(A(n, m)\) 显然会 TLE,我们需要进行进一步优化。
我们发现在 \(A(n, m)\) 中大量出现 \(tk\),我们可以尝试把 \(tk\) 提出来:
\[ \begin{align*} A(n, m) &= \sum_{k \in Primes}{ \sum_{t = 1}^{ \min\{ \lfloor \frac{n}{k} \rfloor , \lfloor \frac{m}{k} \rfloor \} }{ \mu(t) \lfloor \frac{n}{tk} \rfloor \lfloor \frac{m}{tk} \rfloor } } \\ &= \sum_{x = 1}^{ \min\{n, m\} }{ \sum_{ k | x, k \in \text{Primes} }{ \mu(\frac{x}{k}) \lfloor \frac{n}{x} \rfloor \lfloor \frac{m}{x} \rfloor } } \\ &= \sum_{x = 1}^{ \min\{n, m\} }{ \lfloor \frac{n}{x} \rfloor \lfloor \frac{m}{x} \rfloor \sum_{ k | x, k \in \text{Primes} }{ \mu(\frac{x}{k}) } } \end{align*} \]
对于 \(\sum_{ k | x, k \in \text{Primes} }{ \mu(\frac{x}{k}) }\),我们可以在预处理 \(\mu(n)\) 过后预处理该式,然后对该式作前缀和。最后再用数论分块求 \(A(n, m)\) 即可。每次询问的时间复杂度为 \(O(\sqrt{n})\)。
代码演示
1 |
|