莫比乌斯反演例题

本文通过一系列竞赛题目详细介绍了莫比乌斯反演在整除分块问题中的应用,包括NOI2010的能量采集、BZOJ的GCD问题等。通过这些例题,阐述如何利用莫比乌斯反演优化复杂度,解决涉及gcd、约数个数和等数学问题。并探讨了如何结合线性筛、积性函数以及树状数组等数据结构和算法,来处理不同的计算场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整除分块

当运算中有上取整或下取整的时候,用整除分块可以优化复杂度哦(当然,莫比乌斯反演最明显)
经典例题:
(莫比乌斯一大堆,都在下面了)
C F    1603 C    E x t r e m e    E x t e n s i o n CF\;1603C\; Extreme\; Extension CF1603CExtremeExtension

例题

尽量把一些典型的写出来,莫比乌斯还是多写写公式好

[NOI2010day1]T1-能量采集

∑ i = 1 n ∑ j = 1 m 2 × g c d ( i , j ) − 1 \sum_{i=1}^n\sum_{j=1}^m2×gcd(i,j)−1 i=1nj=1m2×gcd(i,j)1

那么只需要处理 ∑ i = 1 n ∑ j = 1 m g c d ( i , j ) \sum_{i=1}^n\sum_{j=1}^mgcd(i,j) i=1nj=1mgcd(i,j)

= ∑ d = 1 n d ∑ d ∣ i ∑ d ∣ j [ g c d ( i , j ) = 1 ] =\sum_{d=1}^nd\sum_{d|i}\sum_{d|j}[gcd(i,j)=1] =d=1nddidj[gcd(i,j)=1]

= ∑ k = 1 n ∑ d = 1 ⌊ n d ⌋ d ∑ i = 1 ⌊ n k d ⌋ ∑ j = 1 ⌊ m k d ⌋ μ ( k ) =\sum_{k=1}^n\sum_{d=1}^{\lfloor \frac{n}{d} \rfloor}d\sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{kd} \rfloor}\mu(k) =k=1nd=1dndi=1kdnj=1kdmμ(k)

= ∑ k = 1 n μ ( k ) ∑ d = 1 ⌊ n d ⌋ d ⌊ n k d ⌋ ⌊ m k d ⌋ =\sum_{k=1}^n\mu(k)\sum_{d=1}^{\lfloor \frac{n}{d} \rfloor}d\lfloor \frac{n}{kd} \rfloor\lfloor \frac{m}{kd} \rfloor =k=1nμ(k)d=1dndkdnkdm

k d = x kd=x kd=x

则 原式 = ∑ x = 1 n ⌊ n x ⌋ ⌊ m x ⌋ ∑ d ∣ x μ ( x d ) d =\sum_{x=1}^n\lfloor \frac{n}{x} \rfloor\lfloor \frac{m}{x} \rfloor\sum_{d|x}\mu(\frac{x}{d})d =x=1nxnxmdxμ(dx)d

则对于每一个x,去枚举每一个k进行预处理(因为这样可以直接把 μ = 0 \mu=0 μ=0的情况判掉),最后用整除分块求解

for(int k=1;k<=x;k++) 
{
	if(!mu[k]) continue;
	for(int X=k;X<=x;X+=k) F[X]+=mu[k]*(X/k);
}
for(int i=1;i<=x;i++) F[i]+=F[i-1];

for(int l=1,r;l<=n;l=r+1)
{
	r=min(n/(n/l),m/(m/l));
	ans+=(F[r]-F[l-1])*(n/l)*(m/l);
}

B Z O J 2820    Y Y 的 G C D BZOJ2820 \;YY的GCD BZOJ2820YYGCD

与上一题差别不大,把枚举每个 d d d改成枚举每个质数即可

[SDOI2015] 约数个数和

首先声明这个函数的一个性质:

d ( i j ) = ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = 1 ] d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1] d(ij)=xiyj[gcd(x,y)=1]

于是我们要求的答案就是:

∑ i = 1 n ∑ j = 1 m ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = 1 ] \sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[gcd(x,y)=1] i=1nj=1mxiyj[gcd(x,y)=1]

= ∑ k = 1 n μ ( k ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ∑ x = 1 ⌊ n i k ⌋ ∑ y = 1 ⌊ m j k ⌋ =\sum_{k=1}^n\mu(k)\sum_{i=1}^{\lfloor \frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}\sum_{x=1}^{\lfloor \frac{n}{ik} \rfloor}\sum_{y=1}^{\lfloor \frac{m}{jk} \rfloor} =k=1nμ(k)i=1knj=1kmx=1ikny=1jkm

= ∑ k = 1 n μ ( k ) ∑ i = 1 ⌊ n k ⌋ ⌊ n i k ⌋ ∑ j = 1 ⌊ m k ⌋ ⌊ m j k ⌋ =\sum_{k=1}^n\mu(k)\sum_{i=1}^{\lfloor \frac{n}{k}\rfloor}\lfloor \frac{n}{ik}\rfloor\sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}\lfloor \frac{m}{jk} \rfloor =k=1nμ(k)i=1kniknj=1kmjkm

S ( n ) = ∑ i = 1 n ( ⌊ n i ⌋ ) S(n)=\sum_{i=1}^n(\lfloor \frac{n}{i} \rfloor) S(n)=i=1n(in)

则原式 = ∑ k = 1 n μ ( k ) S ( ⌊ n k ⌋ ) S ( ⌊ m k ⌋ ) =\sum_{k=1}^n\mu(k)S(\lfloor \frac{n}{k} \rfloor)S(\lfloor \frac{m}{k} \rfloor) =k=1nμ(k)S(kn)S(km)

S ( n ) S(n) S(n)的求解用一次整除分块, a n s ans ans的求解再用一次,两次解决!

B Z O J 2301    P r o b l e m    b BZOJ2301 \;Problem\; b BZOJ2301Problemb

用类似二维前缀和的方法求解就ok了

BZOJ4407 于神之怒加强版

∑ i = 1 n ∑ j = 1 m gcd ⁡ ( i , j ) t     m o d   1 0 9 + 7 \sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^t\ \bmod 10^9+7 i=1nj=1mgcd(i,j)t mod109+7

(以下省略模数)

= ∑ d = 1 n d t ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ [ g c d ( i , j ) = 1 ] =\sum_{d=1}^nd^t\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d}\rfloor}[gcd(i,j)=1] =d=1ndti=1dnj=1dm[gcd(i,j)=1]

= ∑ k = 1 n μ ( k ) ∑ d = 1 ⌊ n d ⌋ d t ⌊ n k d ⌋ ⌊ m k d ⌋ =\sum_{k=1}^n\mu(k)\sum_{d=1}^{\lfloor \frac{n}{d} \rfloor}d^t\lfloor \frac{n}{kd} \rfloor\lfloor \frac{m}{kd} \rfloor =k=1nμ(k)d=1dndtkdnkdm

k d = x kd=x kd=x

则 原式 = ∑ x = 1 n ⌊ n x ⌋ ⌊ m x ⌋ ∑ d ∣ x μ ( x d ) d t =\sum_{x=1}^n\lfloor \frac{n}{x} \rfloor\lfloor \frac{m}{x} \rfloor\sum_{d|x}\mu(\frac{x}{d})d^t =x=1nxnxmdxμ(dx)dt

F ( n ) = ∑ d ∣ n μ ( n d ) d t F(n)=\sum_{d|n}\mu(\frac{n}{d})d^t F(n)=dnμ(dn)dt

则可以发现, F ( n ) F(n) F(n)为积性函数,可以用线性筛来求
1.显然 F ( 1 ) = 1 F(1)=1 F(1)=1
2.当 i i i为质数时,只有 1 , i 1,i 1,i两个因子,计算得 F ( i ) = i t − 1 F(i)=i^t-1 F(i)=it1
3.当 i i i不为质数时
(1)若 i % p [ j ] = = 0 i\%p[j]==0 i%p[j]==0,那么对于这一个因子来说 F ( p k ) F(p^k) F(pk)只有当 d = p k d=p^k d=pk d = p k − 1 d=p^{k-1} d=pk1时才有值,所以 F ( p k ) = ( p k ) t − ( p k − 1 ) t F(p^k)=(p^k)^t-(p^{k-1})^t F(pk)=(pk)t(pk1)t 得到 F ( p k × p ) = F ( p k ) × p t F(p^k\times p)=F(p^k)\times p^t F(pk×p)=F(pk)×pt
(2)若 i % p [ j ] = = 0 i\%p[j]==0 i%p[j]==0,积性函数直接乘起来就行

【BZOJ2693】jzptab最小公倍数之和

∑ i = 1 n ∑ j = 1 m l c m ( i , j ) \sum_{i=1}^n\sum_{j=1}^mlcm(i,j) i=1nj=1mlcm(i,j)

= ∑ i = 1 n ∑ j = 1 m i j g c d ( i , j ) =\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)} =i=1nj=1mgcd(i,j)ij

= ∑ d = 1 n ∑ d ∣ i ∑ d ∣ j i j d [ g c d ( i , j ) = d ] =\sum_{d=1}^n\sum_{d|i}\sum_{d|j}\frac{ij}{d}[gcd(i,j)=d] =d=1ndidjdij[gcd(i,j)=d]
因为提出来两个d,所以变成 i j d 2 / d ijd^2/d ijd2/d,约分

= ∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j [ g c d ( i , j ) = 1 ] =\sum_{d=1}^nd\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}ij[gcd(i,j)=1] =d=1ndi=1dnj=1dmij[gcd(i,j)=1]
提出来两个k所以乘 k 2 k^2 k2

= ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) ∑ i = 1 ⌊ n k d ⌋ ∑ j = 1 ⌊ m k d ⌋ i j k 2 =\sum_{d=1}^nd\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{kd} \rfloor}ijk^2 =d=1ndk=1dnμ(k)i=1kdnj=1kdmijk2

= ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) ∑ i = 1 ⌊ n k d ⌋ i k ∑ j = 1 ⌊ m k d ⌋ j k =\sum_{d=1}^nd\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor}ik\sum_{j=1}^{\lfloor \frac{m}{kd} \rfloor}jk =d=1ndk=1dnμ(k)i=1kdnikj=1kdmjk

S ( n ) = ∑ i = 1 n i = n ( n + 1 ) 2 S(n)=\sum_{i=1}^ni=\frac{n(n+1)}{2} S(n)=i=1ni=2n(n+1)

则原式

= ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) k 2 S ( ⌊ n k d ⌋ ) S ( ⌊ m k d ⌋ ) =\sum_{d=1}^nd\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)k^2S(\lfloor \frac{n}{kd} \rfloor)S(\lfloor \frac{m}{kd} \rfloor) =d=1ndk=1dnμ(k)k2S(kdn)S(kdm)

x = k d x=kd x=kd

= ∑ x = 1 n S ( ⌊ n x ⌋ ) S ( ⌊ m x ⌋ ) ∑ k ∣ x μ ( k ) k 2 x k =\sum_{x=1}^nS(\lfloor \frac{n}{x} \rfloor)S(\lfloor \frac{m}{x} \rfloor)\sum_{k|x}\mu(k)k^2\frac{x}{k} =x=1nS(xn)S(xm)kxμ(k)k2kx

= ∑ x = 1 n S ( ⌊ n x ⌋ ) S ( ⌊ m x ⌋ ) x ∑ k ∣ x μ ( k ) k =\sum_{x=1}^nS(\lfloor \frac{n}{x} \rfloor)S(\lfloor \frac{m}{x} \rfloor)x\sum_{k|x}\mu(k)k =x=1nS(xn)S(xm)xkxμ(k)k

F ( n ) = n ∑ k ∣ n μ ( k ) k F(n)=n\sum_{k|n}\mu(k)k F(n)=nknμ(k)k

可进行线性筛,方法与上面类似,进行分类讨论即可

[bzoj3529-Sdoi2014] 数表

如果没有<=a的限制,那么我们要求的东西就是

∑ i = 1 n ∑ j = 1 m D ( g c d ( i , j ) ) \sum_{i=1}^n\sum_{j=1}^mD(gcd(i,j)) i=1nj=1mD(gcd(i,j))

其中 D ( x ) D(x) D(x)表示x的所有因子之和
这个还是老套路,枚举一下d然后求起来很简单

∑ x = 1 n ⌊ n x ⌋ ⌊ m x ⌋ ∑ d ∣ x μ ( x d ) D ( d ) \sum_{x=1}^n\lfloor \frac{n}{x} \rfloor\lfloor \frac{m}{x} \rfloor\sum_{d|x}\mu(\frac{x}{d})D(d) x=1nxnxmdxμ(dx)D(d)

数据范围允许,nlogn求出后面那一坨 F ( x ) F(x) F(x),前面进行整除分块就行了

然而这道题没有那么简单,因为它有限制啊!!!!!!!!
有点二维数点的意思了。要用到树状数组去维护,离线处理
首先把所有的询问存起来,按照限制从小往大排序,这样就能依次把贡献加进去了
然后这次我们不求 F ( x ) F(x) F(x),而是求 D ( d ) D(d) D(d),存到a里,a[d].sum表示D(d),a[d].d表示d,依据sum进行升序
这样我们就能保证询问是从小到大,加入的值也是从小到大了
然后就是枚举每一个问题,只要sum的值<限制,那么就往里加,至于记录d的原因,是因为还要 × μ ( x d ) \times\mu(\frac{x}{d}) ×μ(dx)啊,然后超出限制就暂停,记录答案,继续下一个

BZOJ3561 DZY Loves Math VI

∑ i = 1 n ∑ j = 1 m l c m ( i , j ) g c d ( i , j ) \sum_{i=1}^n\sum_{j=1}^mlcm(i,j)^{gcd(i,j)} i=1nj=1mlcm(i,j)gcd(i,j)

与上面如出一辙的套路,注意把 μ \mu μ提出来的时候提出来了两个 k k k,所以最后的式子是这样的

∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) k 2 d ∑ i = 1 ⌊ n k d ⌋ i d ∑ j = 1 ⌊ m k d ⌋ j d \sum_{d=1}^nd\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)k^{2d}\sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor}i^d\sum_{j=1}^{\lfloor \frac{m}{kd} \rfloor}j^d d=1ndk=1dnμ(k)k2di=1kdnidj=1kdmjd

又因为这个数据不是很大,nlogn就过了,所以求的时候只需要把后面两个做个前缀和,其他依次枚举就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值