51nod 1355 - 斐波那契的最小公倍数(Min-Max 容斥+莫比乌斯反演)
首先我们知道斐波那契数列的 lcm 是不太容易计算的,但是它们的 gcd 非常容易计算——\(\gcd(f_x,f_y)=f_{\gcd(x,y)}\),该性质已在我的这篇博客中给出了详细证明,这里就不再赘述了。
考虑怎样将 LCM 转化为 gcd,注意到有个东西叫 Min-Max 容斥,即对于集合 \(S\),\(\max(S)=\sum\limits_{\varnothing\ne T\subseteq S}(-1)^{|T|+1}\min(T)\),该性质同样可以应用于 lcm/gcd,因为 \(\operatorname{lcm}\) 即可看作每个数的每个质因子次数取 \(\max\),\(\gcd\) 即可看作每个数的每个质因子次数取 \(\min\),因此我们同样有 \(\operatorname{lcm}(S)=\prod\limits_{\varnothing\ne T\subseteq S}\gcd(T)^{(-1)^{|T|+1}}\),因此我们有 \(ans=\prod\limits_{\varnothing\ne T\subseteq S}f_{\gcd(T)}^{(-1)^{|T|+1}}\)。
到这里还是不太容易直接求,不过考虑有个东西叫莫比乌斯反演,我们记 \(a_d=\sum\limits_{\gcd(T)=d}(-1)^{|T|+1}\),再记 \(b_d=\sum\limits_{d\mid\gcd(T)}(-1)^{|T|+1}\),那么显然 \(ans=\prod\limits_{d}f_d^{a_d}\),接下来考虑怎样求 \(a_d\),按照莫比乌斯反演的套路有 \(b_d=\sum\limits_{d|n}a_n\),即 \(b=a*I\),反演以下可得 \(a=b*\mu\),即 \(a_d=\sum\limits_{d\mid n}b_n\mu(\dfrac{n}{d})\),枚举倍数即可求出 \(a_d\)。那么怎么求 \(b_d\) 呢?记 \(U=\{a_x|d\mid a_x\}\),那么显然所有 \(U\) 的子集都可以成为求和式中的 \(T\),即 \(b_d=\sum\limits_{i=1}^{|U|}\dbinom{|U|}{i}(-1)^i\),根据二项式定理该值就等于 \([|U|>0]\),随便算一下即可,时间复杂度 \(a_i\log a_i\)。
const int MAXV=1e6;
const int MOD=1000000007;
int qpow(int x,int e){
// eprintf("%d\n",e);
if(e<0) e+=MOD-1;int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int n,mu[MAXV+5],pr[MAXV/10+5],prcnt=0;
bitset<MAXV+5> vis;
void sieve(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){pr[++prcnt]=i;mu[i]=-1;}
for(int j=1;j<=prcnt&&pr[j]*i<=n;j++){
vis[pr[j]*i]=1;
if(i%pr[j]==0) break;
mu[i*pr[j]]=-mu[i];
}
}
}
int is[MAXV+5],f[MAXV+5],fib[MAXV+5];
int main(){
sieve(MAXV);scanf("%d",&n);
for(int i=1,x;i<=n;i++) scanf("%d",&x),is[x]=1;
for(int i=1;i<=MAXV;i++) for(int j=i;j<=MAXV;j+=i) is[i]|=is[j];
for(int i=1;i<=MAXV;i++) for(int j=i;j<=MAXV;j+=i) f[i]+=is[j]*mu[j/i];
fib[1]=fib[2]=1;for(int i=3;i<=MAXV;i++) fib[i]=(fib[i-1]+fib[i-2])%MOD;
int mul=1;for(int i=1;i<=MAXV;i++) mul=1ll*mul*qpow(fib[i],f[i])%MOD;
printf("%d\n",mul);
return 0;
}
51nod 1355 - 斐波那契的最小公倍数(Min-Max 容斥+莫比乌斯反演)的更多相关文章
- 【51nod1355】斐波那契的最小公倍数(min-max容斥)
[51nod1355]斐波那契的最小公倍数(min-max容斥) 题面 51nod 题解 显然直接算还是没法算的,所以继续考虑\(min-max\)容斥计算. \[lcm(S)=\prod_{T\su ...
- 51nod1355-斐波那契的最小公倍数【min-max容斥】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义\(f_i\)表示斐波那契的第\(i\)项,给出一个 ...
- [51nod1355] 斐波那契的最小公倍数
Description 给定 \(n\) 个正整数 \(a_1,a_2,...,a_n\),求 \(\text{lcm}(f_{a_1},f_{a_2},...,f_{a_n})\).其中 \(f_i ...
- 51nod 1242 斐波那契数列的第N项
之前一直没敢做矩阵一类的题目 其实还好吧 推荐看一下 : http://www.cnblogs.com/SYCstudio/p/7211050.html 但是后面的斐波那契 推导不是很懂 前面讲的挺 ...
- 51Nod - 1242 斐波那契(快速幂)
斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, ...
- 51nod 1031+斐波那契和杨辉三角的一些基础知识
直接斐波那契... #include<stdio.h> #include<queue> #include<string.h> #include<iostrea ...
- (矩阵快速幂)51NOD 1242斐波那契数列的第N项
斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, ...
- Solution -「51nod 1355」斐波那契的最小公倍数
\(\mathcal{Description}\) Link. 令 \(f\) 为 \(\text{Fibonacci}\) 数列,给定 \(\{a_n\}\),求: \[\operatorn ...
- 51nod 1350 斐波那契表示(递推+找规律)
传送门 题意 分析 我们发现该数列遵循下列规律: 1 1,2 1,2,2 1,2,2,2,3 1,2,2,2,3,2,3,3 我们令A[i]表示f[i]开始长为f[i-1]的i的最短表示和 那么得到A ...
随机推荐
- 初学Python-day11 函数4
函数 1.递归函数 自己不断调用自己的过程 2.递归求和 1 def sum(arg): 2 if arg == 1: 3 return 1 4 return arg + sum(arg - 1) 5 ...
- [Beta]the Agiles Scrum Meeting 3
会议时间:2020.5.14 20:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 yjy 实现前端界面美化 tq 实现查看.删除测试点功能的前端修复功能中的bug wjx 升级系统实现 ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- luogu P2746 [USACO5.3]校园网Network of Schools 题解
前言: 火星题... 但是我调了半天,最后看了题解才明白. Wtcl 解析: 显然先缩个点. 第一问,就是问多少入度为0的点. 第二问,抽象一下就是要添加一些边,让一个DAG变成一个SCC,求最小边数 ...
- python fnmatch & glob
1,转载:Python模块学习 - fnmatch & glob - Dahlhin - 博客园 (cnblogs.com) 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名 ...
- notepad++ 替换回车换行
以" | "为分隔符,换行 结果如下图:
- Linux 限制IP远程连接
1.允许访问编辑 /etc/hosts.allow 文件,如下: sshd:all:allow #允许所有 IP 远程 ssh ...
- MySQL基础学习——SQL对数据库进行操作、对数据库的表进行操作
1.SQL对数据库进行操作: 创建数据库: 语法: create database 数据库名称 [character set 字符集 collate 字符集校对规则];字符集校对规则即所用字符集的数据 ...
- yrm的安装和使用
yrm的安装和使用 我们经常下载包的速度很忙有的还会卡住几十分钟,所以我们需要切换镜像,这样我们下载的速度会快很多 而yrm 是一个 yarn源管理器,允许你快速地在源间切换 安装 npm insta ...
- LeetCode刷题 链表专题
链表专题 链表题目的一般做法 单链表的结构类型 删除节点 方法一 方法二 增加节点 LeedCode实战 LC19.删除链表的倒数第N个结点 解法思路 LC24.两两交换链表中的节点 解法思路 LC6 ...