【51nod1355】斐波那契的最小公倍数(min-max容斥)
【51nod1355】斐波那契的最小公倍数(min-max容斥)
题面
题解
显然直接算还是没法算的,所以继续考虑\(min-max\)容斥计算。
\]
而斐波那契数列满足\(gcd(f(a),f(b))=f(gcd(a,b))\),
于是和最小公倍佩尔数一样的类似处理
\]
令\(a[i]\)是上面那一堆东西,\(b[i]=\sum_{i|d}a[i]\),
然后发现
\]
只和是否存在\(i\)的倍数相关,存在就是\(1\),不存在就是\(0\)。
那么预处理一下就可以算出\(b\)。
而根据莫比乌斯反演,有
\]
所以答案式就是:
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容斥)的更多相关文章
- 51nod 1355 - 斐波那契的最小公倍数(Min-Max 容斥+莫比乌斯反演)
vjudge 题面传送门 首先我们知道斐波那契数列的 lcm 是不太容易计算的,但是它们的 gcd 非常容易计算--\(\gcd(f_x,f_y)=f_{\gcd(x,y)}\),该性质已在我的这篇博 ...
- [51nod1355] 斐波那契的最小公倍数
Description 给定 \(n\) 个正整数 \(a_1,a_2,...,a_n\),求 \(\text{lcm}(f_{a_1},f_{a_2},...,f_{a_n})\).其中 \(f_i ...
- 51nod1355-斐波那契的最小公倍数【min-max容斥】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义\(f_i\)表示斐波那契的第\(i\)项,给出一个 ...
- Solution -「51nod 1355」斐波那契的最小公倍数
\(\mathcal{Description}\) Link. 令 \(f\) 为 \(\text{Fibonacci}\) 数列,给定 \(\{a_n\}\),求: \[\operatorn ...
- 斐波那契堆(一)之 图文解析 和 C语言的实现
概要 本章介绍斐波那契堆.和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了 ...
- 斐波那契堆(二)之 C++的实现
概要 上一章介绍了斐波那契堆的基本概念,并通过C语言实现了斐波那契堆.本章是斐波那契堆的C++实现. 目录1. 斐波那契堆的介绍2. 斐波那契堆的基本操作3. 斐波那契堆的C++实现(完整源码)4. ...
- 斐波那契堆(三)之 Java的实现
概要 前面分别通过C和C++实现了斐波那契堆,本章给出斐波那契堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斐波那契堆的介绍2. 斐波那契堆的基本操作3. 斐波那契堆 ...
- Java算法求最大最小值,冒泡排序,斐波纳契数列一些经典算法<不断更新中>
清明在家,无聊,把一些经典的算法总结了一下. 一.求最大,最小值 Scanner input=new Scanner(System.in); int[] a={21,31,4,2,766,345,2, ...
- 斐波那契fib
输入N和N个数(N<=10,每个数<=10^17),对于每个数,要输出能用几个斐波那契数加加减减得到 样例输入: 35101070 样例输出: 124 直接拷题解: fib[i]表示斐波那 ...
随机推荐
- css position 5种不同的值的用法
position属性 position属性指定用于元素的定位方法的类型(静态,相对,固定,绝对或粘性). 有五种不同的值: static relative fixed absolute sticky ...
- WinRAR命令行版本 rar.exe使用详解(适用Linux)
RAR 命令行语法: RAR.exe <命令> [ -<开关> ] <压缩文件> [ <@列表文件...> ] [ <文件...> ] [ ...
- 在linux下配置jupyter notebook,本地浏览器访问
1.安装jupyter notebook pip install jupyter 2.生成配置文件 jupyter notebook --generate-config 3.设置登陆密码并生成秘钥 s ...
- django学习-管理界面、视图
django管理界面 设计背景 为你的员工或客户生成一个用户添加,修改和删除内容的后台是一项缺乏创造性和乏味的工作.因此,django全自动地根据模型创建后台界面. django产生于一个公众页面和内 ...
- 【大数据】0001---使用SparkSQL关联两个表求和取前几行
场景: 有两个表,表可以是文本或Json数据,结构化后分别是Table1(A,B,C)和Table2(C.D.E),两个表通过C关联,要求求出D+E之和,并以(A.B.D+E)三列返回 解答: 思路: ...
- k8s进入指定pod下的指定容器的命令
访问某pod的某个容器: kubectl --namespace=default exec -it user-deployment-54469dd57-vg87g --container user - ...
- python27期day10:函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用、作业题。
1.动态参数的作用: 能够接收不固定长度参数 位置参数过多时可以使用动态参数 * args是程序员之间约定俗称(可以更换但是不建议更换) * args获取的是一个元组 ** kwargs获取的是一个字 ...
- python利用beautifulsoup多页面爬虫
利用了beautifulsoup进行爬虫,解析网址分页面爬虫并存入文本文档: 结果: 源码: from bs4 import BeautifulSoup from urllib.request imp ...
- redixdb 基于redis 协议的实时key-value 存储
redixdb 是一个基于redis 协议搞的一个实时key value 处理的轻量级应用,支持多种后端 存储模型. 以下是一个小版的容器镜像(官方的太大了) dockerfile FROM go ...
- 洛谷4965 薇尔莉特的打字机(Trie,DP)
神仙题. 考虑在一棵 Trie 上进行染色,将可能出现的串的末尾染成黑色.答案就是黑点的个数.一开始只有 \(A\) 的末尾点是黑色. 当出现一个字符(不是退格)\(c\) 时,就要将每个黑点的 \( ...