斐波那契的最小公倍数
原题链接: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}\)
有了以上两个性质,我们就能够来证明引理了。
其中第一步用了性质 \(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\) 容斥的公式:
运用到 \(\mathrm{lcm}\) 和 \(\gcd\) 当中(定义 \(p\) 为素数,\(S_p\) 表示 \(S\) 中每个元素包含的最大的 \(p\) 次幂的新集合)
将 \(S\) 集合在套上 \(f\) 的意义下操作(证明同理,唯一区别是在最后一步用了引理),知:
这样算根本没有得到简化,巧妙的一步来了,我们尝试将 \(f_{\gcd}\) 拆开,构造一个函数 \(g\),使得 \(f_n=\prod_{d\mid n} g_d\),则:
考虑每个 \(g_d\) 的指数部分,假设 \(S\) 中有 \(t\) 个数(\(t>0\))整除于 \(d\),则指数等于:
所以问题转化为了:
最后一个没有解决的问题就是如何构造这样的 \(g\),有两种方法(其实是本质相同的):
第一种,简单朴素,利用递推:
第二种,观察到这个形式是乘法版的狄利克雷卷积,于是我们可以尝试改造一下莫比乌斯反演:
回顾莫比乌斯反演:
若要改造成乘法,很简单,两边取对数即可!
综上,总时间复杂度为 \(O(n\log n)\)