Loj6102. 「2017 山东二轮集训 Day1」第三题(min-max 反演)
Loj6102. 「2017 山东二轮集训 Day1」第三题(min-max 反演)
题目大意
输入一个大小为 \(n\) 的集合 \(S\),求 \(lcm_{k∈S}f_k\),其中 \(f_k\) 是第 \(k\) 个 Fibonacci 数。
数据范围
$ n \le 5 \cdot 10^4,k \le 10^6$
解题思路
有人说是经典题,我觉得是神仙题
首先要有一些前置知识
- 莫比乌斯反演
- min-max 容斥
- \(\gcd(f_i, f_j) = f_{\gcd(i, j)}\)
首先一步 min-max 反演
\[\large lcm(f_S)=\prod_{\varnothing\ne T\subseteq S}\gcd(f_k)_{k \in T}^{(-1)^{|T|-1}}
\]
解释一下,将每个质因子分开考虑,它们可以分别 min-max 容斥,原来 min-max 的加法通过变成指数变成了乘法,各个质因子是独立的,因此可以一起计算
\[\large lcm(f_S)=\prod_{\varnothing\ne T\subseteq S}f_{\gcd(k)_{k \in T}}^{(-1)^{|T|-1}}
\]
这一步用了 \(\gcd(f_i, f_j) = f_{\gcd(i, j)}\)
然后看到 gcd 就会想到反演(真能想到吗),设 \(f_i = \prod_{d|i} g_d\),有 \(g_i = f_i\prod_{d|i \and d \neq i} g_d^{-1}\)
\[\large lcm(f_S)=\prod_{\varnothing\ne T\subseteq S}{(\prod_{d|gcd(k)}g_d})^{(-1)^{|T|-1}}\\
\large lcm(f_S) = \prod_d g_d^{\sum_{\varnothing\ne T\subseteq S_d}(-1)^{|T|-1}}
\]
其中 \(S_d = \{x | x \in S \and d| x\}\) ,容易(真的容易吗)发现 \(\sum_{T \subseteq S} (-1)^{|T|-1} = 0\)
所以 \(\sum_{\varnothing \neq T \subseteq S} (-1)^{|T|-1} = 1(|S| \neq \varnothing)\)
因此有
\[\large lcm(f_S)= \prod_{\exists k, d | k} g_d
\]
代码就很简单了吧