正题
现在在这里再来讲述一遍莫比乌斯反演。
莫比乌斯反演基于一条公式。
不懂的小伙伴先去找数论函数的介绍看看。
假如现在要求,.开到更大可以用杜教筛来做。
那么我们可以把后面的,换成
就变成了
那么我们又可以预处理的前缀和,又可以对后面的东西进行整除分块。
时间就是了。(认为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。
那么两边同时成上,得到 。