莫比乌斯反演例题
- 整除分块
- 例题
- [NOI2010day1]T1-能量采集
- [ B Z O J 2820 Y Y 的 G C D BZOJ2820 \;YY的GCD BZOJ2820YY的GCD](http://192.168.1.105/homework/974/problem/898)
- [[SDOI2015] 约数个数和](http://192.168.1.105/homework/974/problem/897)
- [ B Z O J 2301 P r o b l e m b BZOJ2301 \;Problem\; b BZOJ2301Problemb](http://192.168.1.105/homework/974/problem/891)
- [BZOJ4407 于神之怒加强版](http://192.168.1.105/homework/974/problem/895)
- 【BZOJ2693】jzptab最小公倍数之和
- [[bzoj3529-Sdoi2014] 数表](http://192.168.1.105/homework/975/problem/894)
- [BZOJ3561 DZY Loves Math VI](http://192.168.1.105/homework/975/problem/893)
整除分块
当运算中有上取整或下取整的时候,用整除分块可以优化复杂度哦(当然,莫比乌斯反演最明显)
经典例题:
(莫比乌斯一大堆,都在下面了)
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=1∑nj=1∑m2×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=1∑nj=1∑mgcd(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=1∑ndd∣i∑d∣j∑[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=1∑nd=1∑⌊dn⌋di=1∑⌊kdn⌋j=1∑⌊kdm⌋μ(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=1∑nμ(k)d=1∑⌊dn⌋d⌊kdn⌋⌊kdm⌋
令 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=1∑n⌊xn⌋⌊xm⌋d∣x∑μ(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 BZOJ2820YY的GCD
与上一题差别不大,把枚举每个 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)=x∣i∑y∣j∑[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=1∑nj=1∑mx∣i∑y∣j∑[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=1∑nμ(k)i=1∑⌊kn⌋j=1∑⌊km⌋x=1∑⌊ikn⌋y=1∑⌊jkm⌋
= ∑ 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=1∑nμ(k)i=1∑⌊kn⌋⌊ikn⌋j=1∑⌊km⌋⌊jkm⌋
令 S ( n ) = ∑ i = 1 n ( ⌊ n i ⌋ ) S(n)=\sum_{i=1}^n(\lfloor \frac{n}{i} \rfloor) S(n)=i=1∑n(⌊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=1∑nμ(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=1∑nj=1∑mgcd(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=1∑ndti=1∑⌊dn⌋j=1∑⌊dm⌋[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=1∑nμ(k)d=1∑⌊dn⌋dt⌊kdn⌋⌊kdm⌋
令 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=1∑n⌊xn⌋⌊xm⌋d∣x∑μ(dx)dt
令 F ( n ) = ∑ d ∣ n μ ( n d ) d t F(n)=\sum_{d|n}\mu(\frac{n}{d})d^t F(n)=d∣n∑μ(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)=it−1
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=pk−1时才有值,所以
F
(
p
k
)
=
(
p
k
)
t
−
(
p
k
−
1
)
t
F(p^k)=(p^k)^t-(p^{k-1})^t
F(pk)=(pk)t−(pk−1)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=1∑nj=1∑mlcm(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=1∑nj=1∑mgcd(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=1∑nd∣i∑d∣j∑dij[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=1∑ndi=1∑⌊dn⌋j=1∑⌊dm⌋ij[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=1∑ndk=1∑⌊dn⌋μ(k)i=1∑⌊kdn⌋j=1∑⌊kdm⌋ijk2
= ∑ 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=1∑ndk=1∑⌊dn⌋μ(k)i=1∑⌊kdn⌋ikj=1∑⌊kdm⌋jk
令 S ( n ) = ∑ i = 1 n i = n ( n + 1 ) 2 S(n)=\sum_{i=1}^ni=\frac{n(n+1)}{2} S(n)=i=1∑ni=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=1∑ndk=1∑⌊dn⌋μ(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=1∑nS(⌊xn⌋)S(⌊xm⌋)k∣x∑μ(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=1∑nS(⌊xn⌋)S(⌊xm⌋)xk∣x∑μ(k)k
令 F ( n ) = n ∑ k ∣ n μ ( k ) k F(n)=n\sum_{k|n}\mu(k)k F(n)=nk∣n∑μ(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=1∑nj=1∑mD(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=1∑n⌊xn⌋⌊xm⌋d∣x∑μ(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=1∑nj=1∑mlcm(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=1∑ndk=1∑⌊dn⌋μ(k)k2di=1∑⌊kdn⌋idj=1∑⌊kdm⌋jd
又因为这个数据不是很大,nlogn就过了,所以求的时候只需要把后面两个做个前缀和,其他依次枚举就行