正题
现在在这里再来讲述一遍莫比乌斯反演。
莫比乌斯反演基于一条公式
。
不懂的小伙伴先去找数论函数的介绍看看。
假如现在要求
,
.开到更大可以用杜教筛来做。
那么我们可以把后面的
,换成
就变成了

那么我们又可以预处理
的前缀和,又可以对后面的东西进行整除分块。
时间就是
了。(认为n,m同阶)。
程序中就是直接按照定义欧拉筛出
,然后做一遍前缀和,后面整除分块本人喜欢这种写法。
mu[1]=1;
for(int i=2;i<=maxn;i++){
if(!vis[i]) {p[++p[0]]=i;mu[i]=-1;}
for(int j=1;j<=p[0] && (temp=i*p[j])<maxn;j++){
vis[temp]=true;
if(i%p[j]==0) break;
mu[temp]=-mu[i];
}
mu[i]+=mu[i-1];
}
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
l=1;
while(l<=n){
r=min(n/(n/l),m/(m/l));
ans+=(long long)(n/l)*(m/l)*(mu[r]-mu[l-1]);
l=r+1;
}
printf("%lld\n",ans);
}
其实莫比乌斯反演是这样的:
有
,*为狄利克雷卷积。
现在已知h,求f。
那么两边同时成上
,得到
。

本文详细介绍了莫比乌斯反演的概念及其在数论中的应用。通过具体实例展示了如何利用莫比乌斯函数进行反演计算,并提供了完整的代码实现。
5万+

被折叠的 条评论
为什么被折叠?



