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

然后看看这个式子等于什么:

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

也就是说,只要有一个元素是 \(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;
}

[51nod1355] 斐波那契的最小公倍数的更多相关文章

  1. 【51nod1355】斐波那契的最小公倍数(min-max容斥)

    [51nod1355]斐波那契的最小公倍数(min-max容斥) 题面 51nod 题解 显然直接算还是没法算的,所以继续考虑\(min-max\)容斥计算. \[lcm(S)=\prod_{T\su ...

  2. 51nod 1355 - 斐波那契的最小公倍数(Min-Max 容斥+莫比乌斯反演)

    vjudge 题面传送门 首先我们知道斐波那契数列的 lcm 是不太容易计算的,但是它们的 gcd 非常容易计算--\(\gcd(f_x,f_y)=f_{\gcd(x,y)}\),该性质已在我的这篇博 ...

  3. Solution -「51nod 1355」斐波那契的最小公倍数

    \(\mathcal{Description}\)   Link.   令 \(f\) 为 \(\text{Fibonacci}\) 数列,给定 \(\{a_n\}\),求: \[\operatorn ...

  4. HDU3977(斐波那契数列模n的循环节长度)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...

  5. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. python迭代器实现斐波拉契求值

    斐波那契数列(Fibonacci sequence),又称黄金分割数列,也称为"兔子数列":F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*).例 ...

  7. Ural 1225. Flags 斐波那契DP

    1225. Flags Time limit: 1.0 secondMemory limit: 64 MB On the Day of the Flag of Russia a shop-owner ...

  8. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  9. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

随机推荐

  1. webpack2入门概念

    webpack是一种JavaScript应用模块化打包工具,它配置起来简单易上手,因此很多企业工程化代码都使用它来打包.在具体介绍如何使用webpack之前,先来介绍下webpack的四个核心概念. ...

  2. Linux 搭建Nginx+uWSGI+Django环境

    安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...

  3. UML建模工具

    UML:Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段 ...

  4. 【常用指令】git+服务器+数据库

    git日程操作 服务器常用操作 ①同步master git pull origin master ②创建分支 git checkout -b 分支名 ③常规操作 git diff git add 文件 ...

  5. Unity进阶----AssetBundle_03(2018/11/07)

    1. 为啥有AB包? 因为资源需要更新, 避免更新一次打包一次 动态修改. 2. AB包注意啥? 依赖关系 找依赖关系应该找到对应的平台!!! 3. 打包策略是分场景打包 若文件被文件夹包含打包出来的 ...

  6. 分布式、服务化的ERP系统架构设计

    ERP之痛 曾几何时,我混迹于电商.珠宝行业4年多,为这两个行业开发过两套大型业务系统(ERP).作为一个ERP系统,系统主要功能模块无非是订单管理.商品管理.生产采购.仓库管理.物流管理.财务管理等 ...

  7. 浏览器本地数据库 IndexedDB 基础详解

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  8. Java中,多态的实现有哪些要求?实现多态的关键技术?

     多态指的是允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).实现多态的方法是动态绑定( Dynamic Binding),动态绑定 ...

  9. MyBatis增、删、改、查

    1.config.xml文件的基本配置信息 2.选择数据源 3.mybatis约定 (1)parameterType和resultType 只能传一个参数,但是我们可以传一个数组或者集合,达到传多个参 ...

  10. 必须知道的Java八大排序算法

    冒泡排序.简单选择.直接插入.快速排序.堆排序.希尔排序.归并排序.基数排序. 将其按排序方式分类如下图所示: 1.冒泡排序: 基本思想——在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上 ...