[51nod1355] 斐波那契的最小公倍数
2024-09-20 23:12:06
Description
给定 \(n\) 个正整数 \(a_1,a_2,...,a_n\),求 \(\text{lcm}(f_{a_1},f_{a_2},...,f_{a_n})\)。其中 \(f_i\) 是斐波那契数列第 \(i\) 项。 \(n\leq 50000,a_i\leq 10^6\)。
Sol
首先关于集合 \(S\) 的\(\text{lcm}\)可以用类似\(\text{min-max}\)容斥的式子搞一下,变成跟\(\gcd\)有关:
\[\text{lcm}(T)=\prod_{S\subseteq T} \gcd(S)^{\left((-1)^{|S|+1}\right)}
\]
\]
所以原式就可以变成:
\[\text{lcm}(f_{\{T\}})=\prod_{S\subseteq T} (f_{\gcd\{S\}})^{\left((-1)^{|S|+1}\right)}
\]
\]
看见这个\(\gcd\)想到莫比乌斯反演
设:
\[f_n=\prod_{d\mid n} g_d
\]
\]
那么:
\[g_n=\frac{f_n}{\prod\limits_{d\mid n\land d\ne n} g_d}
\]
\]
所以原式化为:
\[\begin{aligned}
\text{lcm}(f_{\{T\}})&=\prod_{S\subseteq T}\left(\prod_{d\mid \gcd(S)} g_d \right) ^{\left((-1)^{|S|+1}\right)}\\
&= \prod_{d} g_d^{\;\;\sum\limits_{S\subseteq T\land d\mid \gcd(S)} (-1)^{|T|+1}}
\end{aligned}
\]
\text{lcm}(f_{\{T\}})&=\prod_{S\subseteq T}\left(\prod_{d\mid \gcd(S)} g_d \right) ^{\left((-1)^{|S|+1}\right)}\\
&= \prod_{d} g_d^{\;\;\sum\limits_{S\subseteq T\land d\mid \gcd(S)} (-1)^{|T|+1}}
\end{aligned}
\]
然后看看这个式子等于什么:
\[\sum\limits_{S\subseteq T\land d\mid \gcd(S)} (-1)^{|T|+1}
\]
\]
把所有在 \(T\) 中且是 \(d\) 的倍数的 \(x\) 扔进一个新集合 \(S'\) 中,设\(|S'|=n\),那么:
\[\begin{aligned}
&\sum\limits_{S\subseteq T\land d\mid \gcd(S)} (-1)^{|T|+1}\\
=&\sum_{i=1}^n {n\choose i} (-1)^{i+1}\\
=&(-1)\left(\sum_{i=1}^n {n\choose i}(-1)^i\right)\\
=&(-1)\left( (1-1)^n-1 \right)\\
=&\epsilon(n\neq 0)
\end{aligned}
\]
&\sum\limits_{S\subseteq T\land d\mid \gcd(S)} (-1)^{|T|+1}\\
=&\sum_{i=1}^n {n\choose i} (-1)^{i+1}\\
=&(-1)\left(\sum_{i=1}^n {n\choose i}(-1)^i\right)\\
=&(-1)\left( (1-1)^n-1 \right)\\
=&\epsilon(n\neq 0)
\end{aligned}
\]
也就是说,只要有一个元素是 \(d\) 的倍数,那么 \(g_d\) 就有贡献。
Code
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
const int N=1e6+5;
const int mod=1e9+7;
int n,mx,a[N],f[N],g[N];
int ksm(int a,int b=mod-2,int ans=1){
while(b){
if(b&1) ans=1ll*ans*a%mod;
a=1ll*a*a%mod;b>>=1;
} return ans;
}
void init(int n){
f[1]=1;
for(int i=2;i<=n;i++)
f[i]=(f[i-1]+f[i-2])%mod;
for(int i=1;i<=n;i++)
for(int j=i+i,p=ksm(f[i]);j<=n;j+=i)
f[j]=1ll*f[j]*p%mod;
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),mx=max(mx,a[i]),g[a[i]]=1;
init(mx); int ans=1;
for(int i=1;i<=mx;i++)
for(int j=i;j<=mx;j+=i)
if(g[j]){
ans=1ll*ans*f[i]%mod;
break;
}
printf("%d\n",ans); return 0;
}
最新文章
- REDHAT一总复习1 ssh配置 禁用root用户SSH连接
- Python之路-(Django进阶一)
- 01.Sencha ExtJS 6 - Generate Workspace and Application
- [译]学习IPython进行交互式计算和数据可视化(二)
- HNU 12906 Battleship
- JQuery学习(表单对象属性)---checked
- Hadoop on Mac with IntelliJ IDEA - 9 解决Type mismatch in value from map问题
- codeforces 675E Trains and Statistic 线段树+贪心统计
- QMenu的个性化定制
- [E120L][KitKat][4.4.2][CM11] CM11 rom+ google app安装心得
- POJ3278 Catch That Cow(BFS)
- Longest Substring Without Repeating Characters - 哈希与双指针
- 解释 : translate 功能,过程
- Windows和Linux环境下搭建SVN服务器
- 爬虫、请求库requests
- Golang 入门 : 打造开发环境
- LInux系统木马植入排查分析 及 应用漏洞修复配置(隐藏bannner版本等)
- The MathType Dll cannot be found 问题解决办法
- Spring Cloud 快速教程
- Can’t connect to local MySQL server through socket的解决方法
热门文章
- AES加密算法详解
- LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <;c++>;
- CentOS 编译安装 Nodejs (实测 笔记 Centos 7.3 + node 6.9.5)
- Linux 搭建 Nginx+PHP-FPM环境
- win10企业版永久激活方法
- cadence原理图设计
- KMP算法与传统字符串寻找算法
- 如何用VSCode调试Vue.js
- 导出excel表格,前端和后台导出
- [Swift]LeetCode213. 打家劫舍 II | House Robber II