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

题面

51nod

题解

显然直接算还是没法算的,所以继续考虑\(min-max\)容斥计算。

\[lcm(S)=\prod_{T\subset S}gcd(T)^{(-1)^{|T|+1}}
\]

而斐波那契数列满足\(gcd(f(a),f(b))=f(gcd(a,b))\),

于是和最小公倍佩尔数一样的类似处理

\[lcm(S)=\prod_{i=1}^{\infty}f(i)^{\sum_{T\subset S}[gcd(T)=i](-1)^{|T|+1}}
\]

令\(a[i]\)是上面那一堆东西,\(b[i]=\sum_{i|d}a[i]\),

然后发现

\[b[i]=\prod_{T\subset S}[i|gcd(T)](-1)^{|T|+1}
\]

只和是否存在\(i\)的倍数相关,存在就是\(1\),不存在就是\(0\)。

那么预处理一下就可以算出\(b\)。

而根据莫比乌斯反演,有

\[a[i]=\sum_{i|d}\mu(\frac{d}{i})b[d]
\]

所以答案式就是:

\[\begin{aligned}
lcm(S)&=\prod_{i=1}^{\infty}f(i)^{\sum_{T\subset S}[gcd(T)=i](-1)^{|T|+1}}\\
&=\prod_{i=1}^{\infty}f(i)^{\sum_{i|d}\mu(\frac{d}{i})b[d]}
\end{aligned}\]

也可以预处理之后爆算了。

#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 1000000007
#define MAX 1001000
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int cnt[MAX];
bool zs[MAX];
int pri[MAX],tot,mu[MAX];
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
int n,ans=1,a[MAX],b[MAX],f[MAX];
void Sieve(int n)
{
mu[1]=1;
for(int i=2;i<=n;++i)
{
if(!zs[i])pri[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*pri[j]<=n;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j])mu[i*pri[j]]=-mu[i];
else break;
}
}
}
int main()
{
n=read();
for(int i=1;i<=n;++i)b[read()]=1;
for(int i=1;i<MAX;++i)
for(int j=i+i;j<MAX;j+=i)
b[i]|=b[j];
f[1]=f[2]=1;for(int i=2;i<MAX;++i)f[i]=(f[i-1]+f[i-2])%MOD;
Sieve(MAX-1);
for(int i=1;i<MAX;++i)
for(int j=i;j<MAX;j+=i)
a[i]+=mu[j/i]*b[j];
for(int i=1;i<MAX;++i)
if(a[i]>0)ans=1ll*ans*fpow(f[i],a[i])%MOD;
else if(a[i]<0)ans=1ll*ans*fpow(f[i],MOD-1+a[i])%MOD;
printf("%d\n",ans);
return 0;
}

【51nod1355】斐波那契的最小公倍数(min-max容斥)的更多相关文章

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

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

  2. [51nod1355] 斐波那契的最小公倍数

    Description 给定 \(n\) 个正整数 \(a_1,a_2,...,a_n\),求 \(\text{lcm}(f_{a_1},f_{a_2},...,f_{a_n})\).其中 \(f_i ...

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

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义\(f_i\)表示斐波那契的第\(i\)项,给出一个 ...

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

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

  5. 斐波那契堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍斐波那契堆.和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了 ...

  6. 斐波那契堆(二)之 C++的实现

    概要 上一章介绍了斐波那契堆的基本概念,并通过C语言实现了斐波那契堆.本章是斐波那契堆的C++实现. 目录1. 斐波那契堆的介绍2. 斐波那契堆的基本操作3. 斐波那契堆的C++实现(完整源码)4.  ...

  7. 斐波那契堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了斐波那契堆,本章给出斐波那契堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斐波那契堆的介绍2. 斐波那契堆的基本操作3. 斐波那契堆 ...

  8. Java算法求最大最小值,冒泡排序,斐波纳契数列一些经典算法<不断更新中>

    清明在家,无聊,把一些经典的算法总结了一下. 一.求最大,最小值 Scanner input=new Scanner(System.in); int[] a={21,31,4,2,766,345,2, ...

  9. 斐波那契fib

    输入N和N个数(N<=10,每个数<=10^17),对于每个数,要输出能用几个斐波那契数加加减减得到 样例输入: 35101070 样例输出: 124 直接拷题解: fib[i]表示斐波那 ...

随机推荐

  1. vue中输入框只能输入数字

    方案1:增加自定义指令 自定义指令写法:      directives: {         numberOnly: {             bind(el) {                 ...

  2. nodejs简单http日志存储

    nodejs实现简单http日志存储 /* 日志存储: 202.189.63.115 - - [31/Aug/2008:15:42:31 +0800] "GET / HTTP/1.1&quo ...

  3. mysql数据库之忘记root密码

    1.  vi /etc/my.cnf,在[mysqld]中添加 skip-grant-tables 例如: [mysqld] skip-grant-tables datadir=/var/lib/my ...

  4. pdfium舍弃v8依赖

    Step 3 去除v8依赖 用文本编辑器打开pdfium根目录下的pdfium.gyp文件,找到'javascript'及'jsapi'依赖(47行左右): 'dependencies': [ 'sa ...

  5. day24_7.30 反射与元类

    一.反射 在python中,反射通常是指一个对象应该具备,可以检测修复,增加自身属性的能力. 而反射可以通过字符串对其进行操作. 其中涉及了4个函数,是四个普通 的函数: hasattr(oop,st ...

  6. 【入门篇一】HelloWorld演示(2)

    一.传统使用 Spring 开发一个“HelloWorld”的 web 应用 1. 创建一个 web 项目并且导入相关 jar 包. 2. 创建一个 web.xml 3. 编写一个控制类(Contro ...

  7. python的开发工具pycharm安装及激活

    下面介绍一种较好用也常用的python开发工具Pycharm,此文包括安装及注册激活码 一:安装方法如下: 1:进入官网下载:https://www.jetbrains.com/ 2:下载Commun ...

  8. [RN] windows7 安装 Realm Studio 后,打开报错 A JavaScript error occurred in the main process

    windows7  安装 Realm Studio 后,打开报错 报错如下: A JavaScript error occurred in the main process Uncaught Exce ...

  9. 数据呈现到 ASP.NET Core MVC 中展示

    终于要将数据呈现到 ASP.NET Core MVC 中的 视图 上了 将数据从控制器传递到视图的三种方法 在 ASP.NET Core MVC 中,有 3 种方法可以将数据从控制器传递到视图: 使用 ...

  10. [LeetCode] 281. Zigzag Iterator 之字形迭代器

    Given two 1d vectors, implement an iterator to return their elements alternately. Example: Input: v1 ...