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 \]

代码就很简单了吧

posted @ 2020-06-07 08:15  Hs-black  阅读(277)  评论(0编辑  收藏  举报