【专题】莫比乌斯反演

问题引入:

给定整数 N 和 M。求满足 1\leq x\leq N,1\leq y\leq M 且 gcd(x,y) 为质数的点对 (x,y) 的个数。

数据范围:1\leq N,M\leq 1,000,000

 

接下来会见到以下内容:

  • 莫比乌斯函数
  • 莫比乌斯函数的线性筛
  • 迪利克雷卷积介绍
  • 莫比乌斯反演
  • 整除分块
  • 杜教筛介绍

 

莫比乌斯函数:

\mu (n)=\left\{\begin{matrix} 1 &,n=1; \\ (-1)^{k}&,n=p1p2...pk; \\ 0&,else . \end{matrix}\right.

这里 else 是指:n有大于1的平方因子的情况,如,4、9、16等。

 

莫比乌斯函数的线性筛:

其实,莫比乌斯函数线性筛与普通的线性筛基本相同,只是多了一个 mu[MAXN] 数组罢了。

int prime[MAXN], prime_tot;//prime[MAXN]用于保存质数,prime_tot是质数的个数; 
bool prime_tag[MAXN];//标记是否为质数,false表示是质数,true表示合数; 
int mu[MAXN];//保存n的莫比乌斯函数值; 
void pre_calc(int lim){
	mu[1] = 1;
	for (int i = 2; i <= lim; ++i) {
		if(!prime_tag[i]) {
			prime[++prime_tot] = i;
			mu[i] = -1;
			//质数的莫比乌斯函数值必为-1; 
		}
		for (int j = 1; j <= prime_tot; ++j) {
			if(i * prime[j] > lim)break;
			prime_tag[i * prime[j] ] = true;
			//质数的倍数必是合数 
			if(i % prime[j] == 0) {
				//如果 i能被质数整除 说明 i中必有同一个质数因子
				//那么 i*prime[j] 就必有平方因子 
				mu[i * prime[j] ] = 0;
				break;
			}
			else {
				mu[i * prime[j] ] = -mu[i];
			}
		}
	} 
} 

 

狄利克雷卷积介绍:

狄利克雷卷积是函数之间的运算

狄利克雷卷积:(f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})

积性函数:对于任意互质的整数 a和b 有性质 f(ab)=f(a)f(b)的函数。

完全积性函数:对于任意整数 a和b 有性质 f(ab)=f(a)f(b)的函数。

 

证明:\mu *\mathbf{1}=\varepsilon

设 n 不同的因子的个数为 k,则有

\mu *\mathbf{1}=\sum_{d|n}\mu (d)=\sum_{i=0}^{k}(-1)^{k}\binom{k}{i}

由二项式定理展开,得

(x+y)^{k}=\sum_{i=0}^{k}x^{i}y^{k-i}\binom{k}{i}

令 x = -1,y = 1,代入得

0^{k}=\sum_{i=0}^{k}(-1)^{i}\binom{k}{i}

\mu * \mathbf{1}=\varepsilon

 

下面是一些常见的积性函数:

①欧拉函数 \varphi (n)

欧拉函数是求 \leq n 的质数的个数。

 

②莫比乌斯函数 \mu (n)

本节所讲函数。

 

③单位函数 Id(n)=n

n 是多少就是多少。

 

④不变函数 \mathbf{1}(n)=1

恒等于 1。

 

⑤幂函数 Idk(n)=n^{k}

易知,\left\{\begin{matrix} Id(n) &,k=1 \\ \mathbf{1}(n) &,k=0 \end{matrix}\right.

 

⑥因子个数函数 d(n),d=\mathbf{1}*\mathbf{1}(注意,这里是指不变函数相乘)

 

⑦因子和函数 \sigma (n),\sigma (n)=\mathbf{1}*Id

 

⑧因子函数 \sigma k(n),\sigma k=\mathbf{1}*Idk

 

⑨狄利克雷卷积单位元 \varepsilon =[n==1]

\varepsilon =\left\{\begin{matrix} 1 &,n=1 \\ 0 &,else \end{matrix}\right.

 

其中,①②⑨是比较重要的函数。

(注意:这里的 * 是指做卷积)

 

莫比乌斯反演:

公式一:g(n)=\sum_{d|n}f(d)\rightarrow f(n)=\sum_{d|n}\mu (d)g(\frac{n}{d})

 

公式二:g(n)=\sum_{n|d}f(d)\rightarrow f(n)=\sum_{n|d}\mu (\frac{d}{n})g(d)

(数论千万条,反演第一条。反演不会做,队友两行泪。)

两条公式的差别:一条是印数关系,一条是倍数关系。

 

公式一证明:

g=f*\mathbf{1},\mu *g=f*\mathbf{1}*\mu =f

 

是不是特别简单?

可是,为什么 \mathbf{1}*\mu 会消去?

答案是,不变函数是莫比乌斯函数的乘法逆元。

还不知道什么是乘法逆元的,可以先去学习一下。

 

公式二证明:

令 k=\frac{d}{n},则

\sum_{n|d}\mu (\frac{d}{n})g(d)=\sum_{k}\mu (k)g(nk)=\sum_{k}(\mu (k)\sum_{(nk)|t}f(t))=\sum_{t}(f(t)\sum_{(nk)|t}\mu (k))=\sum_{t}f(t)\varepsilon (\frac{t}{n})=f(n)

 

想一想,为什么第三条式子可以变为第四条式子呢?

因为,当且仅当 (nk|t) 成立的时候,才会对求和有贡献。

 

那么,第四条式子又是怎么去到第五条式子的呢?

仔细看看,(nk)|t\rightarrow n|\frac{t}{k} 是不是成立?那么,\sum_{k|\frac{t}{n}}\mu (k)*\mathbf{1}(\frac{t}{n})\rightarrow \varepsilon (\frac{t}{n})也就出来了。

 

最后,根据狄利克雷卷积单位元的性质,当且仅当 t = n ,即 \varepsilon (1) 时才会有贡献,证毕。

 

回归问题:

 

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

 

求 \sum_{1\leq i\leq N}\sum_{1\leq j\leq M}[gcd(i,j)==p],p是质数。

 

定义,

f(p):=\sum_{1\leq i\leq N}\sum_{1\leq j\leq M}[gcd(i,j)==p]

g(p):=\sum_{1\leq i\leq N}\sum_{1\leq j\leq M}[p|gcd(i,j)]

 

那么,g(n)=\sum_{n|d}f(d) 且有 g(n)=\left \lfloor \frac{N}{n} \right \rfloor\left \lfloor \frac{M}{n} \right \rfloor.。

 

下面开始反演:

f(n)=\sum_{n|d}\mu (\frac{d}{n})g(d)=\sum_{n|d}\mu (\frac{d}{n})\left \lfloor \frac{N}{d} \right \rfloor\left \lfloor \frac{M}{d} \right \rfloor

ans=\sum_{n\in prime}\sum_{n|d}\mu (\frac{d}{n})\left \lfloor \frac{N}{d} \right \rfloor\left \lfloor \frac{M}{d} \right \rfloor

=\sum_{n\in prime}\sum_{t}\mu (t)\left \lfloor \frac{N}{nt} \right \rfloor\left \lfloor \frac{M}{nt} \right \rfloor(t:=\frac{d}{n})

=\sum_{1\leq k\leq mid(N,M)}\left \lfloor \frac{N}{k} \right \rfloor\left \lfloor \frac{M}{k} \right \rfloor\sum_{n|k,n\in prime}\mu (\frac{k}{n})(k:=nt)

 

到这里,复杂度已经降下来一些了,那么怎么解决左边的这一块呢?

 

我们预处理一个 sum(k):=\sum_{n|k,n\in prime}\mu (\frac{k}{n})

for (int i = 1; i <= prime_tot; ++i) {
	for (int j = 1; prime[i] * j <= lim; ++j) {
		sum[prime[i] * j] += mu[j];
	}
} 

 

最终, ans=\sum_{1\leq k\leq min(N,M)}\left \lfloor \frac{N}{k} \right \rfloor\left \lfloor \frac{M}{k} \right \rfloor sum(k)

 

整除分块:

\left \lfloor \frac{N}{k} \right \rfloor(1\leq k\leq N) 约有 2\sqrt{n} 个可能值。

如,N = 25,k = 1,2,3,4,5,6,7-8,9-12,13-25时,\left \lfloor \frac{N}{k} \right \rfloor 共有 9 个互不相同的值。

快速计算的方法:

for (int l = 1, r; i <= N; l = r + 1) {
	r = N / (N / l);
	ans += (r - l + 1) * (N / l);
} 

 

杜教筛:

有些题目要用到前缀和,但是数据范围会很大,这是要用到杜教筛。

例如,求 \sum_{i=1}^{n}\mu (i),n\leq 10^{12}

 

定义:

M(n):=\sum_{i=1}^{n}\mu (i)

1=\sum_{i=1}^{n}\varepsilon (i)=\sum_{i=1}^{n}\sum_{d|i}\mu (d)=\sum_{i=1}^{n}\sum_{j=1}^{\left \lfloor \frac{n}{i} \right \rfloor}u(j)=\sum_{i=1}^{n}M(\left \lfloor \frac{n}{i} \right \rfloor)

M(n)=1-\sum_{i=2}^{n}M(\left \lfloor \frac{n}{i} \right \rfloor)

int mu_sum[MAXN];
unordered_map mp;
int mu_calc (long long n) {
	if (n < lim) return mu_sum[n];
	if (mp.count(n)) return mp[n];
	
	int ret = 1;
	for (long long l = 2, r; l <= n; l = r +1) {
		r = n / (n / l);
		ret -= (r - l + 1) * mu_calc(n / l);
	}
	return mp[n] = ret;
} 

当然,杜教筛还可以应用到更多地方。

 

本文章学习来自:

【算法讲堂】【电子科技大学】【ACM】莫比乌斯反演

 

题目练习:

待补充。。

你可能感兴趣的:(————数论相关————)