51nod_1355

题目链接

题意

给出 \(n\) 个正整数 \(a_1,a_2\cdots,a_n\),求 \(\operatorname{lcm}(F_{a_1}, F_{a_2},\cdots, F_{a_n})\)

其中 \(\{F_i\}\) 为斐波那契数列。
\(2\le n\le 50000, 1\le a_i\le 1000000\)
3s

解答

斐波那契数列的最小公倍数很难直接求,但是其最大公约数却有优美的结论 \(\gcd(F_n, F_m) = F_{\gcd(n, m)}\),于是考虑将最小公倍数转化成最大公约数。

此处有 \(\mathrm{Min-Max}\) 反演的经典推论:

\[\operatorname{lcm}(S) = \prod_{T\subseteq S\land T\not=\varnothing} \left(\gcd(T)\right)^{(-1)^{|T|-1}} \]

证明很简单,分别考虑每个质因子,\(\operatorname{lcm}\) 就是求其 \(\max\)\(\gcd\) 就是求其 \(\min\),即证。

接下来开始推柿子:

\[\begin{split} \operatorname{lcm}(F_s(s\in S)) &=\prod_{T\subseteq S\land T\not ={\varnothing}}\gcd(F_t(t\in T))^{(-1)^{|T|-1}} \\ &=\prod_{T\subseteq S\land T\not ={\varnothing}}F_{\gcd(T)}^{(-1)^{|T|-1}} \end{split} \]

第一步转化完毕!

接下来肯定不能直接枚举子集算,于是进行下一步的推倒:

我们用 \(c_i\) 表示 \(i\) 的倍数出现的次数。

对每个 \(x\) 分别考虑 \(F_x\) 的次数:

\[\begin{split} \sum_{x | T} [\gcd(T) = x](-1)^{|T|-1} &=\sum_{x | T} [\gcd\left(\frac T x\right) = 1](-1)^{|T|-1} \\ &= \sum_{x | T} \sum_{d|\frac Tx } \mu(d)(-1)^{|T|-1} \\ &= \sum_{d=1}^\infty \mu(d)\sum_{i = 1}^{c_{d\cdot x}}\binom{c_{d\cdot x}}{i}(-1)^{-1} \\ &= \sum_{d=1}^\infty \mu(d) [c_{d\cdot x} > 0] \end{split} \]

其中第三行中的 \(i\) 为枚举 \(|T|\)

于是对于每个 \(x\) 枚举 \(d\) 计算,总复杂度是调和级数级别的,也就是 \(\mathcal{O}(n\log n)\) 的。

于是总复杂度为 \(\mathcal{O}(n\sqrt n)\),瓶颈在于枚举因子。

posted @ 2023-05-03 23:23  wiki0922  阅读(9)  评论(0编辑  收藏  举报