博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
莫比乌斯反演的一些简单应用#1
阅读量:5039 次
发布时间:2019-06-12

本文共 2530 字,大约阅读时间需要 8 分钟。

莫比乌斯反演的式子我们在之前已经推导出来了为:

\(f(n)=\sum_{d|n}g(d),g(n)=\sum_{d|n}f(d)\times\mu(\frac n d)\)

具体的推导过程可以参考我之前的一篇。

而我们在推导莫比乌斯反演这个式子之前,曾得到另外一个同样也很重要的式子:

\(\sum_{d|n}\mu(d)=[n=1]\)

也就是 \(\mu*1=\epsilon\)

这个式子有啥用呢?

我们把它稍稍转换一下,令 \(n=gcd(i,j)\),这样的话,式子就变成了:

\(\sum_{d|gcd(i,j)}\mu(d)=[gcd(i,j)=1]\)

而我们可以通过交换 \(\Sigma\) 的位置来实现对一些类似 \(gcd(i,j)=1\) 式子的求解。

例1:

求:\(\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]\)

这个就是我上面说的式子的一个具体应用啦,有了上面的式子,这个问题还是很简单的啦。

\(\ \ \ \ \sum_{i=1}^n\sum_{j=1}^{m}[gcd(i,j)=1]\)

\(=\sum_{i=1}^n\sum_{i=1}^m\sum_{d|gcd(i,j)}\mu(d)\)

\(=\sum_{d=1}^n\mu(d)\sum_{i=1}^{\lfloor\frac n d\rfloor}\sum_{j=1}^{\lfloor\frac m d\rfloor}\)

\(=\sum_{d=1}^n\mu(d)\times\lfloor\frac n d\rfloor\times\lfloor\frac m d\rfloor\)

然后就可以在\(O(\sqrt{n})\) 的时间内求解了。

因为是例1,所以还是贴个代码,当个示范:

#include
#define ll long longconst int N=10000000;int mu[N+5],vis[N+5],sum[N+5],p[N+5];ll ans;int n,m,q;using namespace std;void sieve(){ mu[1]=vis[1]=1; for(int i=2;i<=N;i++){ if (!vis[i]) p[++p[0]]=i,mu[i]=-1; for (int j=1;j<=p[0]&&i*p[j]<=N;j++){ vis[i*p[j]]=1; if (i%p[j]==0){ mu[i*p[j]]=0; break; } mu[i*p[j]]=-mu[i]; } } for (int i=1;i<=N;i++) mu[i]+=mu[i-1];}int main(){ sieve(); scanf("%d",&q); while (q--){ scanf("%d%d",&n,&m); if (n>m) swap(n,m); ans=0; for (int l=1,r;l<=n;l=r+1){ r=min(n/(n/l),m/(m/l)); ans+=1ll*(mu[r]-mu[l-1])*(n/l)*(m/l); } printf("%lld\n",ans); } return 0;}

例2:

求:\(\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]\)

其实这里只需要一个很简单的转化:

\(\ \ \ \ \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]\)

\(=\sum_{i=1}^{\lfloor\frac n k\rfloor}\sum_{j=1}^{\lfloor\frac m k\rfloor}[gcd(i,j)=1]\)

然后就和上面一样啦。

例3:

求:\(\sum_{i=1}^n\sum_{j=1}^mi\times j\times[gcd(i,j)=k]\)

这个和上面其实也没有什么大差别,这里的\(i,j\)其实只是一个副产品,只要我们移\(\Sigma\)的时候不要忘记对\(i,j\)项产生的影响即可。

\(\ \ \ \ \sum_{i=1}^n\sum_{j=1}^mi\times j\times[gcd(i,j)=k]\)

\(=\sum_{i=1}^{\lfloor\frac n k\rfloor}\sum_{j=1}^{\lfloor\frac m k\rfloor}i\times j\times k^2\times[gcd(i,j)=1]\)

\(=k^2\times\sum_{d=1}^{\lfloor\frac n k\rfloor}\mu(d)\times\sum_{i=1}^{\lfloor\frac n {kd}\rfloor}i\times\sum_{j=1}^{\lfloor\frac m {kd}\rfloor}j\)

\(sum[n]=\sum_{i=1}^ni\)

\(=k^2\times\sum_{d=1}^{\lfloor\frac n k\rfloor}d^2\times\mu(d)\times sum[\lfloor\frac n {kd}\rfloor]\times sum[\lfloor\frac m {kd}\rfloor]\)

\(O(\sqrt{n})\) 求解即可。

好了,先就这么多吧,剩下还有很多,毕竟莫比乌斯反演博大精深,以后再写了。

转载于:https://www.cnblogs.com/WR-Eternity/p/10990125.html

你可能感兴趣的文章
iPhone开发中从一个视图跳到另一个视图有三种方法:
查看>>
pytho logging
查看>>
一个Java程序员应该掌握的10项技能
查看>>
c#英文大小写快捷键
查看>>
tpframe免费开源框架又一重大更新
查看>>
一.go语言 struct json相互转换
查看>>
什么是架构设计
查看>>
程序员学习能力提升三要素
查看>>
PHP 微信错误状态返回码说明
查看>>
【4.1】Python中的序列分类
查看>>
ubuntu 移动文件
查看>>
Easy Mock
查看>>
看看 Delphi XE2 为 VCL 提供的 14 种样式
查看>>
Python内置函数(29)——help
查看>>
机器学习系列-tensorflow-01-急切执行API
查看>>
SqlServer 遍历修改字段长度
查看>>
Eclipse快捷键:同时显示两个一模一样的代码窗口
查看>>
《架构之美》阅读笔记05
查看>>
《大道至简》读后感——论沟通的重要性
查看>>
JDBC基础篇(MYSQL)——使用statement执行DQL语句(select)
查看>>