莫比乌斯反演学习笔记

背景:

之前不会用 M a r k d o w n Markdown Markdown,所以坑没有补。

定义:

以下除法默认向下去整。
对于一个形如 F n = ∑ d ∣ n f d F_n=\sum_{d|n}f_d Fn=dnfd的式子,用莫比乌斯反演得到了一个结论: f n = ∑ d ∣ n μ ( d ) ∗ F n / d f_n=\sum\limits_{d|n}μ(d)*F_{n/d} fn=dnμ(d)Fn/d

证明可以考虑狄利克雷卷积(稍后补上)。

那么 μ μ μ的定义是什么呢?
n = 1 n=1 n=1时, μ ( n ) = 1 μ(n)=1 μ(n)=1
n > 1 n>1 n>1时,若 n n n能分为 k k k个互不相等的质因数乘积,则 μ ( n ) = ( − 1 ) k μ(n)=(-1)^k μ(n)=(1)k
否则, μ ( n ) = 0 μ(n)=0 μ(n)=0

同时 μ μ μ是积性函数,因此可以用欧拉筛预处理 μ μ μ

用法:

可是怎么用呢。
我们发现 μ μ μ函数存在一个性质: ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum\limits_{d|n}μ(d)=[n=1] dnμ(d)=[n=1]
证明可以考虑狄利克雷卷积(稍后补上)。

好像还是没有什么用(大雾…)?
别着急。

例题:

∑ i = 1 n ∑ j = 1 n [ g c d ( i , j ) = 1 ] \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}[gcd(i,j)=1] i=1nj=1n[gcd(i,j)=1]

对于这样的题怎么做呢?
显然暴力的时间复杂度是: Θ ( n 2 ) \Theta(n^2) Θ(n2)的。
好像很难…
细心的同学可以发现该式中的 g c d ( i , j ) = 1 gcd(i,j)=1 gcd(i,j)=1 μ μ μ性质 [ n = 1 ] [n=1] [n=1]有些类似,不妨将其套入,得:
∑ i = 1 n ∑ j = 1 n ∑ d ∣ g c d ( i , j ) μ ( d ) \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{d|gcd(i,j)}μ(d) i=1nj=1ndgcd(i,j)μ(d)

更换枚举项,得:
∑ i = 1 n ∑ j = 1 n ∑ d = 1 n μ ( d ) [ d ∣ g c d ( i , j ) ] \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{d=1}^{n}μ(d)[d|gcd(i,j)] i=1nj=1nd=1nμ(d)[dgcd(i,j)]

∑ d = 1 n μ ( d ) \sum\limits_{d=1}^{n}μ(d) d=1nμ(d)前置,得:
∑ d = 1 n μ ( d ) ∑ i = 1 n ∑ j = 1 n [ d ∣ g c d ( i , j ) ] \sum\limits_{d=1}^{n}μ(d)\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}[d|gcd(i,j)] d=1nμ(d)i=1nj=1n[dgcd(i,j)]

更换枚举项,得:
∑ d = 1 n μ ( d ) ∑ i = 1 n / d ∑ j = 1 n / d [ d ∣ ( g c d ( i , j ) ∗ d ) ] \sum\limits_{d=1}^{n}μ(d)\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}[d|(gcd(i,j)*d)] d=1nμ(d)i=1n/dj=1n/d[d(gcd(i,j)d)]

化简,得:
∑ d = 1 n μ ( d ) ∑ i = 1 n / d ∑ j = 1 n / d 1 \sum\limits_{d=1}^{n}μ(d)\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}1 d=1nμ(d)i=1n/dj=1n/d1

最后,得:
∑ d = 1 n μ ( d ) ∗ ⌊ n d ⌋ ∗ ⌊ n d ⌋ \sum\limits_{d=1}^{n}μ(d)*\Big\lfloor\dfrac{n}{d}\Big\rfloor*\Big\lfloor\dfrac{n}{d}\Big\rfloor d=1nμ(d)dndn

可以考虑用整除分块来加速,时间复杂度: Θ ( n ) \Theta(\sqrt{n}) Θ(n )

代码:

以这道题 P 4450 P4450 P4450 双亲数P3455 [POI2007]ZAP-Queries的代码为例题目,但求的是 g c d ( i , j ) = k gcd(i,j)=k gcd(i,j)=k的方案,具体可以看下面题表第一题的证明。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
	int prime[1000010],mu[1000010],sum_mu[1000010];
	bool bz[1000010];
	int n,m,k;
void init(int ma)
{
	bz[0]=bz[1]=true;
	mu[1]=1;
	int t=0;
	for(int i=2;i<=ma;i++)
	{
		if(!bz[i]) prime[++t]=i,mu[i]=-1;
		for(int j=1;j<=t&&i*prime[j]<=ma;j++)
		{
			bz[i*prime[j]]=true;
			if(!(i%prime[j]))
			{
				mu[i*prime[j]]=0;
				break;
			}
			mu[i*prime[j]]=-mu[i];
		}
	}
	for(int i=1;i<=n;i++)
		sum_mu[i]=sum_mu[i-1]+mu[i];
}
LL solve(int n,int m,int k)
{
	LL sum=0;
	n/=k,m/=k;
	for(int l=1,r;l<=min(n,m);l=r+1)
	{
		r=min(n/(n/l),m/(m/l));
		sum+=((LL)n/l)*((LL)m/l)*((LL)sum_mu[r]-sum_mu[l-1]);
	}
	return sum;
}
int main()
{
	scanf("%d %d %d",&n,&m,&k);
	init(max(n,m));
	printf("%lld",solve(n,m,k));
}

总结

重点来了。
我们在化简式子时多考虑 ∑ , ∏ \sum,\prod ,的性质,尝试化简。如果化简出形似 g c d ( i , j ) = 1 gcd(i,j)=1 gcd(i,j)=1的式子,可以考虑带入 μ μ μ的性质,再化简即可。
一般都需要用整除分块的套路,同时,一些题目也需要预处理一些可以被证明的积性函数。

题表
luogu P2522 [HAOI2011]Problem b
luogu P2398 GCD SUM
luogu P1829 [国家集训队]Crash的数字表格 / JZPTAB
luogu P2257 YY的GCD
luogu P3327 [SDOI2015]约数个数和
luogu P3312 [SDOI2014]数表
luogu P3768 简单的数学题
luogu P4917 天守阁的地板
luogu P3704 [SDOI2017]数字表格
luogu P4318 完全平方数
[SPOJ] DIVCNT2 - Counting Divisors
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值