莫比乌斯反演详解

莫比乌斯反演

积性函数

联考D2T3用到了(mu*id=phi)

然后还有(phi*1=id)(mu*1=epsilon)

证明:

(n=prod_{k=1}^{m} p_{k}^{alpha_{k}})(d=prod_{k=1}^{m} p_{k}^{eta_{k}}),由积性函数的性质,我们把不同质因数的分开算,再带入(varphi(N)=N*(1-frac 1 p))即可得到

[egin{aligned} sum_{d | n} phi(d) &=sum_{0 leq eta_{k} leq alpha_{k}} phileft(prod_{k=1}^{m} p_{k}^{eta_{k}} ight) \ &=sum_{0 leq eta_{k} leq alpha_{k}} prod_{k=1}^{m} phileft(p_{k}^{eta_{k}} ight) \ &=sum_{0 leq eta_{k} leq alpha_{k}} prod_{k=1}^{m}left(p_{k}^{eta_{k}}-p_{k}^{eta_{k}-1} ight) \ &=prod_{k=1} sum_{0 leq eta_{k} leq alpha_{k}}left(p_{k}^{eta_{k}}-p_{k}^{eta_{k}-1} ight) \ &=prod_{k=1}^{m} p_{k}^{alpha_{k}} \ &=n end{aligned} ]

莫比乌斯函数

(mu(n)=1,n=1)

(mu (n)=(-1)^m, n=prod^m_{i=1}p_i^{k_i},forall k_i = 1)

(mu (n)=0 ,otherwise)

性质

  1. 积性函数
  2. (sum _{i|n} mu(i)=epsilon (epsilon = [n=1]))

筛法

inline void init(){
    mu[1]=1;
    for(int i=2;i<=n;i++){
        if(!np[i]) pri[++top]=i;
        for(int j=1;j<=top&&i*pri[j]<n;j++){
            int now=i*pri[j];
            np[now]=1;
            if(i%pri[j]) mu[now]=-mu[i];
            else{
                mu[now]=0;break; //出现平方因子
            }
		}	
	}
}

狄利克雷卷积

((f∗g)(n)=∑_{d|n}f(d)∗g(frac{n}{d}))

数论函数与狄利克雷卷积形成群,满足结合律,封闭性,单位元,逆元,同时还满足交换律

其中单位元为(ϵ)(ϵ(n)=[n=1])

比较常用的积性数论函数备用
积性函数

反演

(f(n)=sum_{i|n}g(i))

结论:(g(n)=sum_{d|n}f(frac{n}{d})*{mu(d)}=sum_{d|n}f(d)mu(frac{n}{d}))

证明

展开f:

[g(n)=sum_{d|n}sum_{i|frac{n}{d}}g(i)*mu(d) ]

(mu)到前面

[g(n)=sum_{d|n}mu(d)*sum_{i|frac{n}{d}}g(i) ]

(sum),注意取值范围

[g(n)=sum_{i|n}g(i)*sum_{d|frac{n}{i}}mu(d) ]

考虑后面(sum_{d|frac{n}{i}}mu(d))

  1. (i=n,d=1) ,此时(mu(d)=mu(1)=1)(g(i)*sum_{d|frac{n}{i}}mu(d)=g(n))
  2. (i<n,frac{n}{i}!=1),此时(sum_{d|frac{n}{i}}mu(d)=epsilon(frac{n}{i})=0),乘上 (g(i)) 还是 (0)

于是两种情况相加就是 (g(n)),原等式成立

用狄利克雷卷积写起来就是(f=g*1 , g=f*mu)

第二种形式

[f(d)=sum_{i=1}^{lfloorfrac{n}{d} floor}g(i imes d) ]

[g(d)=sum_{i=1}^{lfloorfrac{n}{d} floor}f(i imes d)mu(i) ]

应用

二维gcd数数

对于给定的整数(a,b)(d),有多少正整数对 (x,y),满足 (xleq n)(yleq m),并且 (gcd(x,y)=d)

要求的数:

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

转换一下:

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

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

法一

利用莫比乌斯函数的性质:

[=sum_{i=1}^{frac{n}{d}}sum_{j=1}^{frac{m}{d}}sum_{g|gcd(i,j)}mu(g) ]

[=sum_{i=1}^{frac{n}{d}}sum_{j=1}^{frac{m}{d}}sum_{g|i且g|j}mu(g) ]

考虑枚举(g),设(N = frac{n}{d},M = frac{m}{d})

归类得:

[sum_{g=1}^{N}sum_{i=1}^{lfloorfrac{N}{g} floor}sum_{j=1}^{lfloorfrac{M}{g} floor}mu(g) ]

[sum_{g=1}^{N}mu(g)sum_{i=1}^{lfloorfrac{N}{g} floor}sum_{j=1}^{lfloorfrac{M}{g} floor} ]

然后后面那个东西的共同取值一种只有(sqrt{n}+sqrt{m})种,数论分块求得

法二

还是令

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

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

(f(k))为答案,(g(k))明显等于(lfloorfrac{n}{k} floorlfloorfrac{m}{k} floor)

根据定义,

[g(d)=sum_{i=1}^{lfloorfrac{n}{d} floor}f(i imes d) ]

反演得

[f(d)=sum_{i=1}^{lfloorfrac{n}{d} floor}g(i imes d)*mu(i) ]

套用(g),令设(N = frac{n}{d},M = frac{m}{d})

[f(d)=sum_{i=1}^{lfloorfrac{n}{d} floor}lfloorfrac{N}{i} floorlfloorfrac{M}{i} floormu(i) ]

然后数论分块

数论分块的tips

对于有两个整除的,我们知道复杂度是(sqrt{n}+sqrt m)

单个数论分块的实现方法:

假设当前区间开头是(i),并且下一个区间是(j+1)

[lfloorfrac{N}{i} floor leq lfloorfrac{N}{j} floor ]

[lfloorfrac{N}{i} floor leq frac{N}{j} ]

[jleq frac{N}{lfloor frac{N}{i} floor} ]

[jleq lfloor frac{N}{lfloor frac{N}{i} floor} floor ]

两个数的同理,取min就好了

代码:

for(int l=1,r;l<=n;l=r+1){
    r=min(n/(n/l),m/(m/l));
   	...
}

题解代码:

#include<iostream>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdio>
#define ll long long
using namespace std;
const int N = 50021;
inline int read(){
	int x=0,pos=1;char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
	for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
	return pos?x:-x;
}
int np[N],pri[N],top,mu[N],tomu[N];
void init(){
	mu[1]=1;
	for(int i=2;i<N;i++){
		if(!np[i]){
			pri[++top]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=top&&i*pri[j]<N;j++){
			int now=i*pri[j];np[now]=1;
			if(i%pri[j]==0){
				mu[now]=0;break;
			}else{
				mu[now]=mu[i]*-1;
			}
		}
	}
	for(int i=1;i<N;i++){
		tomu[i]=tomu[i-1]+mu[i];
	}
}
int T;
int main(){
	init();
	T=read();
	while(T--){
		int a=read(),b=read(),d=read();
		int n=a/d,m=b/d;
		if(n<m) swap(n,m);
		int ans=0;
		for(int l=1,r;l<=n;l=r+1){
			if(n/l==0||m/l==0){
				r=n;
			}else r=min((n/(n/l)),(m/(m/l)));
			ans+=(n/l)*(m/l)*(tomu[r]-tomu[l-1]);
		}
		printf("%d
",ans);
	}
	return 0;
} 

练习题目

YY的gcd

gcd(x,y)为质数的区间数点

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

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

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

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

然后

[g(d)=sum_{i=1}^{lfloorfrac{n}{d} floor}f(i imes d) ]

求的就是

[sum_{din prime}sum_{i=1}^{lfloorfrac{n}{d} floor}g(i imes d)*mu(i) ]

(k =i imes d)

[sum_{d in ext { prime }} sum_{i=1}^{leftlfloorfrac{n}{d} ight floor} mu(frac{k}{d})leftlfloorfrac{n}{k} ight floorleftlfloorfrac{m}{k} ight floor ]

枚举(k),

[sum_{k=1}^{n}lfloorfrac{n}{k} floorlfloorfrac{m}{k} floorsum_{din ext{prime},d|k}mu(frac{k}{d}) ]

[f(k)=sum_{din ext{prime},d|k}mu(frac{k}{d}) ]

考虑线性筛(f)

  1. k为质数,(f(k)=mu(frac{k}{k})=mu(1)=1)

  2. k有多个最小质因子,令(y)为k的最小质因子,(z=frac{k}{y})

    1. z没有多个因子,仅当枚举到(d=y)时,(mu(frac{k}{d})=mu(i))不为0,其余为0,(f(x)=mu(z))
    2. z有多个因子,都为0,(z)的情况等同于(k)的情况,为了方便统计还是令(f(x)=mu(z))
  3. k只有一个最小因子

    对于每一个(mu(frac{k}{p})=mu(frac{z imes y}{p}))

    (z ext{ mod } y =0)

    根据(mu)的定义有(mu(frac{k}{p})=-mu(frac{z}{p})),而且多了一项(mu(i))

所以线性筛出(f)的前缀和,然后数论分块就行了

约数个数和

首先有一个公式:

[sum _{i=1}^{N}sum_{j=1}^Md(ij)=sum _{i=1}^{N}sum_{j=1}^Msum_{x | i} sum_{y | j}[operatorname{gcd}(x, y)=1] ]

好像是有什么映射关系吧。。。避免统计重复

这里可以归纳成一个trick:枚举某个枚举的数的因子的时候可以将后面的sigma提前,枚举后面的数,前面的数的个数就可以直接计算出来了

然后枚举(x)(y),设

[f(x)=sum_{i=1}^{n} sum_{j=1}^{m}leftlfloorfrac{n}{i} ight floorleftlfloorfrac{m}{j} ight floor[operatorname{gcd}(i, j)=x] ]

[g(x)=sum_{i=1}^{n} sum_{j=1}^{m}leftlfloorfrac{n}{i} ight floorleftlfloorfrac{m}{j} ight floor[operatorname{x|gcd}(i, j)] ]

显然有:

[g(x)=sum_{d=1}^{leftlfloorfrac{n}{d} ight floor}f(x imes d) ]

然后有

[f(x)=sum_{d=1}^{leftlfloorfrac{n}{d} ight floor}g(x imes d) imes mu(d) ]

普通的莫反题这里就结束了,因为g很容易求出

这题里的g怎么求呢?

变换一下:

[g(x)=sum_{i=1}^{frac{n}{x}} sum_{j=1}^{frac{m}{x}}leftlfloorfrac{n}{i x} ight floorleftlfloorfrac{m}{j x} ight floor ]

[g(x)=sum_{i=1}^{frac{n}{x}} leftlfloorfrac{n}{i x} ight floorsum_{j=1}^{frac{m}{x}}leftlfloorfrac{m}{j x} ight floor ]

然后处理一下前缀和就可以(O(1))求了

答案是(f(1))

原文地址:https://www.cnblogs.com/lcyfrog/p/11526849.html