斐波那契的最小公倍数

原题链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355
题目大意:
定义斐波那契数列 \(f_0 = 0, f_1=1, f_n=f_{n-1}+f_{n-2} \ (n\ge 2)\),现给出 \(n\) 个整数 \(\{a_i\}\),求出 \(\mathrm{lcm} (f_{a_1}, f_{a_2}, \cdots, f_{a_n})\)


斐波那契最大公约数引理:\(\gcd(f_n, f_m) = f_{\gcd(n, m)}\)

要证明这个引理,我们需要注意到一些性质:

性质 \(1\)\(\gcd(f_n, f_{n-1} )=1\) 对于 \(n\ge1\) 成立

对于数列,因为有递推公式,与归纳法的结构很相似,因此首先考虑归纳。

\(n = 1\) 时,\(\gcd(f_n, f_{n-1}) = 1\)

\(n>1\) 时,\(\gcd(f_n, f_{n-1}) = \gcd(f_{n-1}+f_{n-2}, f_{n-1}) =\gcd(f_{n-2}, f_{n-1}) = 1\)

性质 \(2\)\(f_{n+m} = f_{n-1}f_m+f_{n}f_{m+1}\)

同样考虑归纳,对于这类有多个变量的,只需要挑选一个变量归纳即可,在这里对 \(m\) 归纳。

\(m=0\) 时,\(f_n = f_n\times 1\)

\(m=1\) 时,\(f_{n+1} = f_{n-1} + f_n\)

\(m>1\) 时,\(f_{n+m} = f_{n+m-2} + f_{n+m-1} = f_{n-1}(f_{m-2} + f_{m-1}) + f_n(f_{m-1} + f_m) = f_{n-1}f_m + f_n f_{m+1}\)

有了以上两个性质,我们就能够来证明引理了。

\[\gcd(f_{n+m}, f_m) = \gcd(f_{n-1}f_m + f_nf_{m+1}, f_m)=\gcd(f_nf_{m+1}, f_m)=\gcd(f_n, f_m) \]

其中第一步用了性质 \(2\),最后一步用了性质 \(1\)(合理性证明可以利用具体数学中讲到的,考察每个素因子的次数)。这样我们通过辗转相除法的步骤,即可归纳证明引理成立。


回原题,我们要求 \(\mathrm{lcm} (f_S)\),而 \(\mathrm{lcm}\) 并不是我们所熟悉的形式,需要想办法转换到 \(\gcd\) 上去。还记得吗?在两元运算中,\(\mathrm{lcm}(a, b)\times \gcd(a, b) = ab\),但是很遗憾,这种做法不能拓展到多元。多元情况只能两两合并,这样会爆模数,于是,我们只能另寻它法。

换一个视角,\(\mathrm{lcm}\) 就是对于每个素因子的次数求 \(\max\),而 \(\gcd\) 就是对于每个素因子的次数求 \(\min\),这样就能和 \(\min -\max\) 容斥相联系了!回顾 \(\min -\max\) 容斥的公式:

\[\max(S) = \sum_{T\subseteq S} (-1)^{|T|-1}\min(T) \]

运用到 \(\mathrm{lcm}\)\(\gcd\) 当中(定义 \(p\) 为素数,\(S_p\) 表示 \(S\) 中每个元素包含的最大的 \(p\) 次幂的新集合)

\[\begin{aligned} \mathrm{lcm}(S) = \prod_p p^{\max(S_p)} &=\prod_p p^{\sum_{T\subseteq S} (-1)^{|T|-1} \min(T_p)}\\ &=\prod_{T\subseteq S} \left(\prod_p p^{\min(T_p)}\right)^{(-1)^{|T|-1}}\\ &=\prod_{T\subseteq S} \gcd(T)^{(-1)^{|T|-1}} \end{aligned} \]

\(S\) 集合在套上 \(f\) 的意义下操作(证明同理,唯一区别是在最后一步用了引理),知:

\[\mathrm{lcm}(f_S) = \prod_{T\subseteq S} f_{\gcd(T)}^{(-1)^{|T|-1}} \]

这样算根本没有得到简化,巧妙的一步来了,我们尝试将 \(f_{\gcd}\) 拆开,构造一个函数 \(g\),使得 \(f_n=\prod_{d\mid n} g_d\),则:

\[\begin{aligned} \mathrm{lcm}(f_S) &= \prod_{T\subseteq S} \left(\prod_{d\mid \gcd(T)}g_d\right)^{(-1)^{|T|-1}}\\ &=\prod_{d} g_d^{\sum_{T\subseteq S} [d\mid \gcd(T)] (-1)^{|T|-1}} \end{aligned} \]

考虑每个 \(g_d\) 的指数部分,假设 \(S\) 中有 \(t\) 个数(\(t>0\))整除于 \(d\),则指数等于:

\[\sum_{i=1}^{t}(-1)^{i-1} \binom{t}{i}=1-\sum_{i=0}^t (-1)^i \binom{t}{i} = 1 \]

所以问题转化为了:

\[\mathrm{lcm}(f_S) = \prod_{\exist x\in S, d\mid x} g_d \]

最后一个没有解决的问题就是如何构造这样的 \(g\),有两种方法(其实是本质相同的):

第一种,简单朴素,利用递推:

\[g_n = \dfrac{f_n}{\prod_{d\mid n, d\neq n} g_d} \]

第二种,观察到这个形式是乘法版的狄利克雷卷积,于是我们可以尝试改造一下莫比乌斯反演:

回顾莫比乌斯反演:

\[f_n = \sum_{d\mid n} g_n \Leftrightarrow g_n =\sum_{d\mid n}\mu(\frac nd)f_d \]

若要改造成乘法,很简单,两边取对数即可!

\[\begin{aligned} \ln f_n = \sum_{d\mid n} \ln g_d &\Leftrightarrow \ln g_n = \sum_{d\mid n} \mu(\frac nd)\ln f_d\\ g_n &= e^{\sum_{d\mid n} \mu(\frac nd)\ln f_d}=\prod_{d\mid n} f_d^{\mu(\frac nd)} \end{aligned} \]

综上,总时间复杂度为 \(O(n\log n)\)

posted @ 2022-05-22 11:59  alfayoung  阅读(74)  评论(0编辑  收藏  举报