1355 斐波那契的最小公倍数

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1355

斐波那契数列定义如下:

F(0) = 0 F(1) = 1
F(n) = F(n-1) + F(n-2)

给出n个正整数a1, a2,...... an,求对应的斐波那契数的最小公倍数,由于数字很大,输出Mod 1000000007的结果即可。

例如:1 3 6 9, 对应的斐波那契数为:1 2 8 34, 他们的最小公倍数为136。

Input

第1行:1个数N,表示数字的数量(2 <= N <= 50000)。
第2 至 N + 1行:每行1个数,对应ai。(1 <= ai <= 1000000)。

Output

输出Lcm(F(a1), F(a2) ...... F(an)) Mod 1000000007的结果。

Input示例

4
1
3
6
9

Output示例

136

首先要用到一个定理 gcd(Fiba,Fibb)=Fibgcd(a,b) ,在这里证明一下好了。

根据递推式的定义 Fibn=Fibn?1+Fibn?2 显然有 gcd(Fibn,Fibn?1)=1 和 Fibn+m=Fibn?1?Fibm+Fibn?Fibm+1 ,那么就有 gcd(Fibn+m,Fibn)=gcd(Fibn?1?Fibm,Fibn)=gcd(Fibm,Fibn) ,下标上有辗转相减的形式,所以可以归纳证明 gcd(Fiba,Fibb)=Fibgcd(a,b) 。

然后再来考虑LCM和GCD之间的关系。

n=2时,有 lcm(Fiba,Fibb)=Fiba?FibbFibgcd(a,b) 。

n=3时,有 lcm(Fiba,Fibb,Fibc)=Fiba?Fibb?Fibc?Fib?1gcd(a,b)?Fib?1gcd(a,c)?Fib?1gcd(b,c)?Fibgcd(a,b,c) ,这个结果可以类比通过子集的最小值得到全集最大值的容斥方法得到。

大概读到这里都发现可以 O(2n) 容斥了,但是此题 n≤50000 ,显然会超时啊,所以考虑优化。

细心的人可以发现 ai≤106 ,这么密集的数字进行容斥,所以自然而然的想到反演大法好咯,以下设 A=maxni=1ai 。

考虑 Fibai 对答案的贡献有点难度,但是我们可以反演之后将贡献定义到 Fibj{j|ai} 上,将反演的结果写出来可以发现,令 G(n)=Fibn?∏d|n,d<nG(d)?1 ,答案即 ∏Ad=1[∑ni=1[d|ai]]G(d) ,就是说存在一个 ai 被 d 整除的话就考虑 d 的贡献,那么 G(d) 以及中间的真值表达式可以通过 O(AlogA) 的预处理得到,再 O(AlogA) 扫一遍用快速幂统计贡献即可,反演的主要作用是将贡献整理开,实现上可以先不做这个处理 G(d) 的操作,而是算出 Fibd 实际贡献的幂次,这样每个数来一遍快速幂就好。  by tls

时间: 2024-10-11 05:09:54

1355 斐波那契的最小公倍数的相关文章

51nod 1355 斐波那契的最小公倍数

Description 斐波那契数列定义如下: \[ f[n]= \begin{cases} 1 , & \text {if $n$ is equal to $0$ or $1$} \f(n-1) + f(n-2), & \text{otherwise} \end{cases} \] 给出 \(n\) 个正整数 \(a_1, a_2,\cdots ,a_n\) ,求对应的斐波那契数的最小公倍数,由于数字很大,输出 \(\bmod{ 1000000007}\) 的结果即可. \(2\le N

NEFU115 斐波那契的整除 【整除】

题目连接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=115 题目大意: 斐波那契数列有如下递归定义,f(1)=1,f(2)=1, 且n>=3,f(n)=f(n-1)+f(n-2),它的前几项可以表示为 1, 1,2 ,3 ,5 ,8,13,21,34-,问题是:若 f(n)能被3整除,则输出"3": 若f(n) 能被4整 除,则输出"4":如果能被12整除,输出"YE

实现斐波那契神兔

1.用循环实现不死神兔 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契. 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔, 再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡, 问:一对刚出生的兔子,一年内繁殖成多少对兔子? 1 1 2 3 5 8 13 21 1 import java.util.Arrays; 2 3 public class Tu { 4 5 public static void main(String

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

斐波纳契数之组合

斐波纳契数之组合 Time Limit: 1000 MS Memory Limit: 65535 K Total Submit: 145(66 users) Total Accepted: 83(65 users) Rating: Special Judge: No Description 斐波那契数列是这么定义的:F0 = 1, F1 = 1, F2 = F1 + F0,··· Fn = Fn-1 + Fn-2(n>=2),对于每一项,它们都是斐波那契数. 现在给出一个整数d,求一个组合使得a

NYOJ 698 A Coin Problem (斐波那契)

链接:click here 题意: 描述 One day,Jiameier is tidying up the room,and find some coins. Then she throws the coin to play.Suddenly,she thinks of a problem ,that if throw n times coin ,how many situations of no-continuous up of the coin. Hey,Let's solve the

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

求斐波那契数的python语言实现---递归和迭代

迭代实现如下: def fab(n): n1 = 1 n2 = 1 if n<1: print("输入有误!") return -1 while (n-2)>0: n3 = n2+n1 n1 = n2 n2 = n3 n-=1 return n3 number = int(input("请输入要求的斐波那契数的第几个数:")) result = fab(number) print(result) 递归实现如下: def fab(n): if n==1 o

OJ_1064.计算斐波那契第n项

1064. 计算斐波那契第n项 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 输入n,编写程序输出斐波那契数列的第n项.其中斐波那契数列f(n)的定义如下: f(1)=0,f(2)=1         f(n)=f(n-1)+f(n-2)(n>=2) 输入 一行一个正整数n. 输出 输出一个数f(n). 样例输入 5 样例输出 3 数据范围限制 1<=n<=30 1 #include<cstdio> 2 #include&