vjudge 题面传送门

首先我们知道斐波那契数列的 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 容斥+莫比乌斯反演)的更多相关文章

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

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

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

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

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

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

  4. 51nod 1242 斐波那契数列的第N项

    之前一直没敢做矩阵一类的题目 其实还好吧 推荐看一下 : http://www.cnblogs.com/SYCstudio/p/7211050.html 但是后面的斐波那契 推导不是很懂  前面讲的挺 ...

  5. 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, ...

  6. 51nod 1031+斐波那契和杨辉三角的一些基础知识

    直接斐波那契... #include<stdio.h> #include<queue> #include<string.h> #include<iostrea ...

  7. (矩阵快速幂)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, ...

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

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

  9. 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 ...

随机推荐

  1. 指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计

    作者:吴云涛,腾讯 CSIG 高级工程师导语 | 最近梳理了一下如何用 Flink 来实现实时的 UV.PV 指标的统计,并和公司内微视部门的同事交流.然后针对该场景做了简化,并发现使用 Flink ...

  2. 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树

    最短路径问题 概念 可以通过"traceroute"命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的 ...

  3. [no_code][Beta] 中期组内总结

    $( "#cnblogs_post_body" ).catalog() 目前scrum meeting beta阶段目前共7次.在alpha阶段我们博客发布时间比较匆忙,是扣分项, ...

  4. STM32采集AD的输入阻抗问题

    在做一款消费电子产品时,需要采集电池电压(3.3V-4.2V),同时在休眠的时候希望尽量减小待机电流.电池电压采集电路采用两个1%的300K电阻进行分压,由该电路引起的待机电路为4.2/(300+30 ...

  5. stm32直流电机驱动与测速学习总结

    通过实验发现,定时器的一个通道控制一个pwm信号. 在正式开始之前也可以参考这个视频学习资料 (stm32直流电机驱动) http://www.makeru.com.cn/live/1392_1218 ...

  6. Java代理:静态代理、JDK动态代理和CGLIB动态代理

    代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式.所谓的代理者是指一个类别可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.存储器中的大对象.文件或其它昂贵或无法复制 ...

  7. linux shell文件合并 去重 分割

    1,合并+去重+分割 转载:shell 文件合并,去重,分割 - kakaisgood - 博客园 (cnblogs.com) 第一:两个文件的交集,并集前提条件:每个文件中不得有重复行1. 取出两个 ...

  8. Swift-技巧(二)模糊脸部功能

    摘要 本文介绍模糊脸部的功能逻辑和实现方式,实现方式会尽可能的使用苹果提供的 API,保证功能高效率和简洁. 逻辑 模糊脸部的逻辑主要有两个流程,就是先找到脸部,然后模糊脸部,那么就引申出这两个实现问 ...

  9. Python3 装逼神器---词云(wordcloud)

    词云 (Word Cloud)是对文本中出现频率较高的词语给予视觉化展示的图形, 是一种常见的文本挖掘的方法. 实例:     依赖包: # pip3 install wordcloud  jieba ...

  10. 【微服务落地】服务间通信方式: gRPC的入门

    gRPC是什么 官方介绍: https://grpc.io/docs/what-is-grpc/introduction/ "A high-performance, open-source ...