一.莫比乌斯反演基础
1.莫比乌斯函数
定义:
μ
(
x
)
:
\mu(x):
μ(x):
若
x
为
1
,
则
μ
(
x
)
=
1
若x为1,则\mu(x)=1
若x为1,则μ(x)=1;
若
x
=
p
1
p
2
p
3
p
4
.
.
.
p
k
,
即
每
一
项
的
指
数
都
不
超
过
1
,
那
么
μ
(
x
)
=
(
−
1
)
k
若x=p_1p_2p_3p_4...p_k,即每一项的指数都不超过1,那么\mu(x)=(-1)^k
若x=p1p2p3p4...pk,即每一项的指数都不超过1,那么μ(x)=(−1)k;
其
他
情
况
下
,
μ
(
x
)
=
0
其他情况下,\mu(x)=0
其他情况下,μ(x)=0。
性质:
∑
μ
(
d
)
(
d
∣
n
)
:
\sum\mu(d)(d|n):
∑μ(d)(d∣n):
n
=
1
⇒
1
n=1\Rightarrow 1
n=1⇒1
n
>
1
⇒
0
n>1\Rightarrow 0
n>1⇒0
证明:
当n=1时,显然是1;
当n>1是,设n= ∏ i = 1 k p i a i \prod_{i=1}^k p_i^{a_i} ∏i=1kpiai,假设其中有r个质因数的次数为1,其余均为0,那么有C(k,r)种选法。
然后根据定义有 a n s = C k 0 − C k 1 + C k 2 − C k 3 . . . . . . + ( − 1 ) i C k i ans=C_k^0-C_k^1+C_k^2-C_k^3......+(-1)^iC_k^i ans=Ck0−Ck1+Ck2−Ck3......+(−1)iCki
只需证明 ∏ i = 1 k ( − 1 ) i ∗ C k i = 0 即 可 \prod_{i=1}^k(-1)^i*C_k^i=0即可 ∏i=1k(−1)i∗Cki=0即可
利用二项式定理可得:
( x + y ) n = ∑ C n i x i y n − i (x+y)^n=\sum C_n^ix^iy^{n-i} (x+y)n=∑Cnixiyn−i,再令x=-1,y=1,就可以得到结论了。
还有其他的一些性质,这里只做罗列,因为好像基本用不上。
性
质
1
:
∑
μ
(
d
)
d
(
d
∣
n
)
=
ϕ
(
n
)
n
性质1:\sum\frac{\mu(d)}{d}(d|n)=\frac{\phi(n)}{n}
性质1:∑dμ(d)(d∣n)=nϕ(n)
性
质
2
:
∑
ϕ
(
d
)
(
d
∣
n
)
=
n
性质2:\sum\phi(d)(d|n)=n
性质2:∑ϕ(d)(d∣n)=n
性
质
3
:
μ
(
x
)
为
积
性
函
数
,
且
f
(
n
)
=
∑
μ
(
d
)
(
d
∣
n
)
也
为
积
性
函
数
性质3:\mu(x)为积性函数,且f(n)=\sum\mu(d)(d|n)也为积性函数
性质3:μ(x)为积性函数,且f(n)=∑μ(d)(d∣n)也为积性函数
2.莫比乌斯反演经典模型
莫比乌斯反演所涉及的问题往往是,已知一个很好求的函数可以用另外一种不好求的函数的某种加和形式表达出来(一般和整除性有关),然后就可以通过莫比乌斯函数来实现通过好求的函数反过来求不好求的函数。
形式一
F
(
n
)
=
∑
d
∣
n
f
(
d
)
⇒
f
(
n
)
=
∑
d
∣
n
μ
(
d
)
F
(
n
d
)
F(n)=\sum_{d|n}{f(d)}\Rightarrow f(n)=\sum_{d|n}{\mu(d)F(\frac{n}{d})}
F(n)=d∣n∑f(d)⇒f(n)=d∣n∑μ(d)F(dn)
证明:
∑ d ∣ n μ ( d ) F ( n d ) \sum_{d|n}{\mu(d)F(\frac{n}{d})} ∑d∣nμ(d)F(dn)
= ∑ d ∣ n μ ( d ) ∑ d ′ ∣ n d f ( d ′ ) =\sum_{d|n}{\mu(d)}\sum_{d'|\frac{n}{d}}{f(d')} =∑d∣nμ(d)∑d′∣dnf(d′) F(n)的定义
= ∑ d ∣ n f ( d ) ∑ d ′ ∣ n d μ ( d ′ ) =\sum_{d|n}{f(d)}\sum_{d'|\frac{n}{d}}{\mu(d')} =∑d∣nf(d)∑d′∣dnμ(d′)
= f ( n ) =f(n) =f(n) 套用莫比乌斯函数的性质可得只有当d=n时才会造成贡献。
其实证明并不是那么重要,只要会套用就好了。
形式二
F
(
n
)
=
∑
n
∣
d
f
(
d
)
⇒
f
(
n
)
=
∑
n
∣
d
μ
(
d
n
)
F
(
d
)
F(n)=\sum_{n|d}{f(d)}\Rightarrow f(n)=\sum_{n|d}{\mu(\frac{d}{n})F(d)}
F(n)=n∣d∑f(d)⇒f(n)=n∣d∑μ(nd)F(d)
这里的证明类似于上面的证明方式,同样也要用到莫比乌斯函数的性质。但是注意要先将
d
n
\frac{d}{n}
nd替换成k之后再进行讨论,要顺畅一些。
形式二是最为常用的一种形式。
二.例题
1. BZOJ 2440 完全平方数
题意: 求第k个无平方因子数。
做法:
二分+容斥
首先二分出x,将问题转化为求[1,x]以内的所有的无平方因子数的数目。
然后我们可以利用容斥来做:
x以内的无平方因子数的数目=含有0个质数相乘的数的平方的数(1的倍数)-含有1个质数相乘的数的平方的数(4,9,25…的倍数)+含有2个质数相乘的数的平方的数(36,100…的倍数);
然后我们可以发现每个平方数前面的系数正好是开方之后的莫比乌斯函数值。比如2(平方后是4)前面的系数是miu(2)=-1,发现正好是-1;6(平方后是36)前面的系数是miu(6)=1,发现正好是36。
然后问题就变成了求
∑
μ
(
d
)
×
⌊
n
d
2
⌋
\sum{\mu(d)\times\lfloor\frac{n}{d^2}\rfloor}
∑μ(d)×⌊d2n⌋,然后我们发现d只需要枚举到
n
\sqrt{n}
n的级别就可以了。
这其实不是真正的莫比乌斯反演,应该是属于莫比乌斯函数的运用一类的(原作者也这么说)。
2.HDU 1695 GCD
题意: 求满足gcd(x,y)=k(1≤x≤b 1≤y≤d)的无序数对(x,y)的个数。
做法:
这是一道典型的莫比乌斯函数反演的题目,几乎已经成为了一道模板题,在各种莫比乌斯反演的题目中经常作为一种工具出现。
因为它是有范围的,为了简化问题,我们将b/=k,d/=k,就将整个问题进行了转化:求gcd(x,y)=1(1<=x<=b,1<=y<=d)的个数。
这道题有两种做法,首先先简略介绍一下第一种做法:
容斥原理:
枚举x,然后求对应的y的个数。
然后问题又变成了求[1,d]内与x互质的数的个数。
将x质因数分解后,枚举有几个质因数参与构成因子,然后假设乘起来是y,那么就有
⌊
d
y
⌋
\lfloor\frac{d}{y}\rfloor
⌊yd⌋个数包含y这个因子,然后直接容斥就好了。
第二种做法才是讲解的重点:
莫比乌斯反演:
令f(i)表示gcd(x,y)=i的对数,F(i)表示i|gcd(x,y)的对数。
那么有:
F
(
n
)
=
∑
n
∣
d
f
(
d
)
=
⌊
B
d
⌋
⌊
D
d
⌋
F(n)=\sum_{n|d}{f(d)}=\lfloor\frac{B}{d}\rfloor\lfloor\frac{D}{d}\rfloor
F(n)=n∣d∑f(d)=⌊dB⌋⌊dD⌋
这不正好满足了之前的形式二吗?
那么就直接套用了:
f
(
i
)
=
∑
i
∣
d
μ
(
d
i
)
F
(
d
)
=
∑
i
∣
d
μ
(
d
i
)
⌊
B
d
⌋
⌊
D
d
⌋
f(i)=\sum_{i|d}{\mu(\frac{d}{i})F(d)}=\sum_{i|d}{\mu(\frac{d}{i})\lfloor\frac{B}{d}\rfloor\lfloor\frac{D}{d}\rfloor}
f(i)=∑i∣dμ(id)F(d)=∑i∣dμ(id)⌊dB⌋⌊dD⌋
然后令i=1就是我们所需求的答案了。
3.BZOJ 2301 Problem b
题意: n次询问,每次询问有多少个数对(x,y)满足a<=x<=b,c<=y<=d且gcd(x,y)=k。
数据范围:
N<=1e5,1<=a<=b<=1e5,1<=c<=d<=1e5
做法:
首先运用容斥原理,将询问拆成四个子询问(怎么好像莫比乌斯反演都和容斥有关呢)。将问题转化为了存在多少个数对满足1<=x<=n,1<=y<=m,gcd(x,y)=k。
感觉的出来这就是上一道题了。
但是呢,显然这道题使用O(n*a)的算法是不行的,然后我们就乖乖考虑优化吧。
首先我们发现
⌊
n
d
⌋
\lfloor\frac{n}{d}\rfloor
⌊dn⌋最多会有
2
n
2\sqrt{n}
2n个取值(最多有
n
\sqrt{n}
n个小于
n
\sqrt{n}
n的因数,那么每个这样的因数再对应一个大于
n
\sqrt{n}
n的因数,就有
2
n
2\sqrt{n}
2n个因数了), 那么
⌊
n
d
⌋
⌊
m
d
⌋
\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor
⌊dn⌋⌊dm⌋最多就有
2
(
n
+
m
)
2(\sqrt{n}+\sqrt{m})
2(n+m)个取值了。
这样一来数量就相当少了,可以在多项式当中分别提出来(同类项合并),然后利用莫比乌斯函数的前缀和,就可以做到
O
(
n
)
O(\sqrt{n})
O(n)了。
只要预先将n和m/=2,就可以让d值的枚举变成连续的,然后才可以利用莫比乌斯函数的前缀和进行求解。
int Work(int n,int m,int k)//为刚刚说到的子问题
{
n/=k,m/=k;
int last,ret=0;
for(int i=1;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));//这一步的操作十分神奇,用O(1)求出了这个块的终点位置
ret+=(n/i)*(m/i)*(premiu[last]-premiu[i-1]);
}
return ret;
}
前缀和+分块的思想在莫比乌斯反演当中是十分常见的方法,因此也是格外重要的。
对于中间那一步神奇的操作做一个解释:
因为n/i求出的是当前这个块内的答案,那么对于n/i的实际值来说是偏小的,那么对于n/(n/i)的实际值来说是偏大的,因此求出的是块内的最后一个元素的位置。
出来之后用容斥加加减减就好了( ? ?ω?? )?
4.BZOJ 2820 YGY的GCD
题目: 求有多少数对(x,y)(1<=x<=n,1<=y<=m)满足gcd(x,y)为质数。
数据范围:
n,m<=1e7 数据组数<=1e4
做法:
假如说我们按照最暴力的思路来想,当然是枚举每一个质数,然后就变成了:
A
n
s
=
∑
p
∣
p
为
质
数
m
i
n
(
n
,
m
)
f
(
p
)
Ans=\sum_{p|p为质数}^{min(n,m)}f(p)
Ans=∑p∣p为质数min(n,m)f(p)
=
∑
p
∣
p
为
质
数
m
i
n
(
n
,
m
)
∑
p
∣
i
m
i
n
(
n
,
m
)
μ
(
i
p
)
⌊
n
i
⌋
⌊
m
i
⌋
=\sum_{p|p为质数}^{min(n,m)}\sum_{p|i}^{min(n,m)}{\mu(\frac{i}{p})\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloor}
=∑p∣p为质数min(n,m)∑p∣imin(n,m)μ(pi)⌊in⌋⌊im⌋
=
∑
p
∣
p
为
质
数
m
i
n
(
n
,
m
)
∑
d
m
i
n
(
n
,
m
)
μ
(
d
)
⌊
n
p
d
⌋
⌊
m
p
d
⌋
=\sum_{p|p为质数}^{min(n,m)}\sum_{d}^{min(n,m)}{\mu(d)\lfloor\frac{n}{pd}\rfloor\lfloor\frac{m}{pd}\rfloor}
=∑p∣p为质数min(n,m)∑dmin(n,m)μ(d)⌊pdn⌋⌊pdm⌋(将i/p替换为d)
=
∑
T
=
1
m
i
n
(
n
,
m
)
⌊
n
T
⌋
⌊
m
T
⌋
∑
p
∣
T
μ
(
T
p
)
=\sum_{T=1}^{min(n,m)}{\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}\sum_{p|T}{\mu(\frac{T}{p})}
=∑T=1min(n,m)⌊Tn⌋⌊Tm⌋∑p∣Tμ(pT)(将pd替换为T)
我们发现这样的结构和上一道题又是十分相似的,那么我们只需要得到
g
(
T
)
=
∑
p
∣
T
,
且
p
为
质
数
μ
(
T
p
)
g(T)=\sum_{p|T,且p为质数}{\mu (\frac{T}{p})}
g(T)=∑p∣T,且p为质数μ(pT)的前缀和就可以了。
然后我们可以枚举出1~min(n,m)的每一个质数,然后再把每一个质数的倍数进行更新,是O(logn)的。因为有O(n/logn)个质数(不知道是哪里来的定理),所以说预处理的时间复杂度是O(n)的(神奇呢)。
后面还有两种线性筛的方法,但是都不如这种方法来的直接,之后再补充吧。
5.BZOJ 3529 数表
题目: 题目大意:令F(i)为i的约数和,q次给定n,m,a,求
∑
1
<
=
i
<
=
n
且
1
<
=
j
<
=
m
且
F
(
g
c
d
(
i
,
j
)
)
<
=
a
F
(
g
c
d
(
i
,
j
)
)
(
m
o
d
2
31
)
\sum_{1<=i<=n且1<=j<=m且F(gcd(i,j))<=a}{F(gcd(i,j))}(mod \ 2^{31})
∑1<=i<=n且1<=j<=m且F(gcd(i,j))<=aF(gcd(i,j))(mod 231)
数据范围: n,m<=1e5,q<=2e5,a<=1e9
思路:
这道题一看就非常的恶心。
首先我们可以抛掉第三个限制不看,设g(i)为满足1,2两个条件且gcd(x,y)=i的(x,y)的对数。
那么我们有
g
(
i
)
=
∑
i
∣
d
m
i
n
(
n
,
m
)
μ
(
d
i
)
⌊
n
d
⌋
⌊
m
d
⌋
g(i)=\sum_{i|d}^{min(n,m)}{\mu(\frac{d}{i})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor}
g(i)=∑i∣dmin(n,m)μ(id)⌊dn⌋⌊dm⌋(这不就是前面几道题的赶脚吗…)
F(i)是可以在O(n)的时间里用线性筛筛出来的(如果不懂,可以看一看博主的另外一篇讲线性筛的博客)。
然后我们就可以求答案了:
A
n
s
=
∑
d
=
1
m
i
n
(
n
,
m
)
F
(
d
)
g
(
d
)
Ans=\sum_{d=1}^{min(n,m)}{F(d)g(d)}
Ans=∑d=1min(n,m)F(d)g(d)
=
∑
i
=
1
m
i
n
(
n
,
m
)
F
(
i
)
∑
i
∣
d
m
i
n
(
n
,
m
)
μ
(
d
i
)
⌊
n
d
⌋
⌊
m
d
⌋
=\sum_{i=1}^{min(n,m)}{F(i)\sum_{i|d}^{min(n,m)}{\mu(\frac{d}{i})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor}}
=∑i=1min(n,m)F(i)∑i∣dmin(n,m)μ(id)⌊dn⌋⌊dm⌋
=
∑
d
=
1
m
i
n
(
n
,
m
)
⌊
n
d
⌋
⌊
m
d
⌋
∑
i
∣
d
m
i
n
(
n
,
m
)
F
(
i
)
μ
(
d
i
)
=\sum_{d=1}^{min(n,m)}{\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor}\sum_{i|d}^{min(n,m)}{F(i)\mu(\frac{d}{i})}
=∑d=1min(n,m)⌊dn⌋⌊dm⌋∑i∣dmin(n,m)F(i)μ(id)
那么我们又可以发现,这不就是之前那个分块加前缀和的题了么??!!
那么就可以O(n)枚举i,然后O(logn)更新i的倍数d,就是O(nlogn)的。
怎么样,到了这里就顺畅解决了呢?
我们还有一个限制条件没有使用呢!这才是真正的难点所在啊。
那么我们发现只有F(i)<=a的部分会对前缀和数组造成影响,那么我们就按照每个询问的a值进行排序,然后每次动态加入F(i)就好了。由于是维护一个动态的前缀和数组,那么我们自然而然的就应该想到树状数组了。
然后进行分块访问的时候就可以用O(logn)的时间得到区间和了。询问的复杂度是
O
(
q
×
n
×
l
o
g
2
n
)
O(q\times \sqrt{n}\times log_2^n)
O(q×n×log2n)的,动态加入F(i)是
O
(
n
×
l
o
g
2
n
×
l
o
g
2
n
)
O(n\times log_2^n\times log_2^n)
O(n×log2n×log2n)(调和级数是nlogn,再乘上树状数组的logn),问题就这样解决了呢(感觉是超级难的,可能需要反复琢磨)。
6.BZOJ 2154 Crash的数字表格
题意: 给定n,m,求
∑
i
=
1
n
∑
j
=
1
m
l
c
m
(
i
,
j
)
\sum_{i=1}^{n}\sum_{j=1}^{m}{lcm(i,j)}
∑i=1n∑j=1mlcm(i,j)
数据范围: n,m<=1e7
做法:
A
n
s
=
∑
i
=
1
n
∑
j
=
1
m
l
c
m
(
i
,
j
)
=
∑
i
=
1
n
∑
j
=
1
m
i
∗
j
g
c
d
(
i
,
j
)
Ans=\sum_{i=1}^{n}\sum_{j=1}^{m}{lcm(i,j)}=\sum_{i=1}^{n}\sum_{j=1}^{m}{\frac{i*j}{gcd(i,j)}}
Ans=∑i=1n∑j=1mlcm(i,j)=∑i=1n∑j=1mgcd(i,j)i∗j(根据lcm的定义可得)
然后我们枚举d=gcd(i,j)。自己定义一个函数为:
F
(
x
,
y
)
=
∑
1
<
=
i
<
=
x
且
1
<
=
j
<
=
y
且
g
c
d
(
i
,
j
)
=
1
i
∗
j
F(x,y)=\sum_{1<=i<=x且1<=j<=y且gcd(i,j)=1}{i*j}
F(x,y)=∑1<=i<=x且1<=j<=y且gcd(i,j)=1i∗j
那么就可以有:
A
n
s
=
∑
d
=
1
m
i
n
(
n
,
m
)
F
(
n
d
,
m
d
)
×
d
2
d
=
∑
d
=
1
m
i
n
(
n
,
m
)
F
(
n
d
,
m
d
)
×
d
Ans=\sum_{d=1}^{min(n,m)}{\frac{F(\frac{n}{d},\frac{m}{d})\times d^2}{d}}=\sum_{d=1}^{min(n,m)}{F(\frac{n}{d},\frac{m}{d})\times d}
Ans=∑d=1min(n,m)dF(dn,dm)×d2=∑d=1min(n,m)F(dn,dm)×d
那么现在的问题就是如何求出F(x,y)这个函数了。
是这里用到了莫比乌斯反演。
定义
S
u
m
(
x
,
y
)
=
∑
1
<
=
i
<
=
x
且
1
<
=
j
<
=
y
i
∗
j
Sum(x,y)=\sum_{1<=i<=x且1<=j<=y}{i*j}
Sum(x,y)=∑1<=i<=x且1<=j<=yi∗j。
那么可以用F把Sum表示出来:
S
u
m
(
x
,
y
)
=
∑
d
=
1
m
i
n
(
x
,
y
)
F
(
x
d
,
y
d
)
×
d
2
=
x
∗
(
x
+
1
)
2
×
y
∗
(
y
+
1
)
2
Sum(x,y)=\sum_{d=1}^{min(x,y)}{F(\frac{x}{d},\frac{y}{d})}\times d^2=\frac{x*(x+1)}{2}\times \frac{y*(y+1)}{2}
Sum(x,y)=∑d=1min(x,y)F(dx,dy)×d2=2x∗(x+1)×2y∗(y+1)。
然后我们就可以开始反演了:
F
(
x
,
y
)
=
∑
i
=
1
m
i
n
(
x
,
y
)
μ
(
i
)
∗
i
∗
i
∗
S
u
m
(
⌊
x
i
⌋
,
⌊
y
i
⌋
)
F(x,y)=\sum_{i=1}^{min(x,y)}{\mu(i)*i*i*Sum(\lfloor\frac{x}{i}\rfloor,\lfloor\frac{y}{i}\rfloor)}
F(x,y)=∑i=1min(x,y)μ(i)∗i∗i∗Sum(⌊ix⌋,⌊iy⌋)(这里还不是很明白,之后搞清楚后会补上的)。
7.BZOJ4407 于神之怒
题意: 给定n,m,z,求
∑
i
=
1
n
∑
j
=
1
m
g
c
d
(
i
,
j
)
z
(
m
o
d
1
e
9
+
7
)
\sum_{i=1}^{n}\sum_{j=1}^{m}{gcd(i,j)^z}(mod\ 1e9+7)
∑i=1n∑j=1mgcd(i,j)z(mod 1e9+7)
数据范围: 1<=n,m,z<=5e6(不妨假设n<=m)
做法:
跟上一道题一样,首先枚举d=gcd(i,j)。那么有:
A
n
s
=
∑
d
=
1
n
d
z
∗
g
(
d
)
Ans=\sum_{d=1}^{n}{d^z*g(d)}
Ans=∑d=1ndz∗g(d)(g(d)表示gcd(x,y)=d的个数)
=
∑
d
=
1
n
d
z
×
∑
d
∣
k
n
μ
(
k
d
)
⌊
n
k
⌋
⌊
m
k
⌋
=\sum_{d=1}^{n}{d^z\times \sum_{d|k}^{n}{\mu(\frac{k}{d})\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor}}
=∑d=1ndz×∑d∣knμ(dk)⌊kn⌋⌊km⌋(第一道例题的结论)
=
∑
d
=
1
n
d
z
×
∑
k
=
1
⌊
n
d
⌋
μ
(
k
)
⌊
n
k
d
⌋
⌊
m
k
d
⌋
=\sum_{d=1}^{n}{d^z\times \sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}{\mu(k)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor}}
=∑d=1ndz×∑k=1⌊dn⌋μ(k)⌊kdn⌋⌊kdm⌋(k的含义已经变了)
然后我们来观察这个式子。发现外层的
⌊
n
d
⌋
\lfloor\frac{n}{d}\rfloor
⌊dn⌋是可以分块的,那么就是
O
(
2
n
)
O(2\sqrt{n})
O(2n)进行外层分块。
然后我们发现内层的
⌊
n
k
d
⌋
⌊
m
k
d
⌋
\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor
⌊kdn⌋⌊kdm⌋也是可以分块的,那么就是进行
O
(
2
(
n
d
+
m
d
)
)
O(2(\sqrt{\frac{n}{d}}+\sqrt{\frac{m}{d}}))
O(2(dn+dm))的内层分块,那么折算下来就是O(n)的了。
还有另外的一种
O
(
n
)
O(\sqrt{n})
O(n)的更为优秀的算法,大致上是把内层的分块提到外层来,然后内层变成了另一个求和式,只需要证明那个求和式是具有积性的,就可以把它的前缀和求出来,然后就可以在外层分块后
O
(
n
)
O(\sqrt{n})
O(n)解决了。
大概就是在之前第二个式子的基础上进行修改:
A
n
s
=
∑
k
=
1
n
⌊
n
k
⌋
⌊
m
k
⌋
∑
d
∣
k
n
d
z
μ
(
k
d
)
Ans=\sum_{k=1}^{n}{\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor}\sum_{d|k}^{n}{d^z \mu(\frac{k}{d})}
Ans=∑k=1n⌊kn⌋⌊km⌋∑d∣kndzμ(dk)
刚才所说的求和式,就是指的
∑
d
∣
k
n
d
z
μ
(
k
d
)
\sum_{d|k}^{n}{d^z \mu(\frac{k}{d})}
∑d∣kndzμ(dk),现在我们来看怎样才能把它筛出来(因为在加强版里面必须做到
O
(
T
∗
n
)
O(T*\sqrt{n})
O(T∗n),否则要TLE)。令g(k)等于这个式子。
因为
d
z
d^z
dz是积性函数,
μ
(
k
d
)
\mu(\frac{k}{d})
μ(dk)也是积性函数,所以说g(k)也是积性的。
g
(
k
)
=
∏
i
=
1
t
g
(
p
i
x
i
)
g(k)=\prod_{i=1}^{t}{g(p_i^{x_i})}
g(k)=∏i=1tg(pixi)
=
∏
i
=
1
t
(
p
i
z
∗
(
x
i
−
1
)
∗
μ
(
p
i
)
+
p
i
z
∗
x
i
∗
μ
(
1
)
)
=\prod_{i=1}^{t}{(p_i^{z*(x_i-1)}*\mu(p_i)+p_i^{z*x_i}*\mu(1))}
=∏i=1t(piz∗(xi−1)∗μ(pi)+piz∗xi∗μ(1))(根据g()的定义将其展开)
=
∏
i
=
1
t
(
p
i
z
∗
(
x
i
−
1
)
(
p
i
z
−
1
)
)
=\prod_{i=1}^{t}{(p_i^{z*(x_i-1)}(p_i^{z}-1))}
=∏i=1t(piz∗(xi−1)(piz−1))
然后我们发现:
g
(
p
i
)
=
p
z
−
1
g(p_i)=p^z-1
g(pi)=pz−1
当i%prime[j]!=0时:
g
(
i
∗
p
r
i
m
e
[
j
]
)
=
g
(
i
)
∗
g
(
p
r
i
m
e
[
j
]
)
g(i*prime[j])=g(i)*g(prime[j])
g(i∗prime[j])=g(i)∗g(prime[j])
当i%prime[j]=0时:
g
(
i
∗
p
r
i
m
e
[
j
]
)
=
g
(
i
)
∗
p
r
i
m
e
[
j
]
z
g(i*prime[j])=g(i)*prime[j]^z
g(i∗prime[j])=g(i)∗prime[j]z
这样子就解决了呢( ̄▽ ̄)~*
8. bookshelf (2018 Multi_University Training Contest 6)
题意: 有一个序列a,满足
∑
i
a
i
=
n
,
求
∑
序
列
a
(
g
c
d
(
2
f
(
a
1
)
,
2
f
(
a
2
)
.
.
.
.
.
.
,
2
f
(
a
k
)
)
)
\sum_i a_i=n,求\sum_{序列a}(gcd(2^{f(a_1)},2^{f(a_2)}......,2^{f(a_k)}))
∑iai=n,求∑序列a(gcd(2f(a1),2f(a2)......,2f(ak)))的值。(其中f()为斐波那契数列)
做法:
首先先有一堆结论进行转化:
g
c
d
(
2
a
−
1
,
2
b
−
1
)
=
2
g
c
d
(
a
,
b
)
−
1
gcd(2^a-1,2^b-1)=2^{gcd(a,b)}-1
gcd(2a−1,2b−1)=2gcd(a,b)−1
⇒
g
c
d
(
2
f
(
a
1
)
,
2
f
(
a
2
)
)
=
2
g
c
d
(
f
(
a
1
)
,
f
(
a
2
)
)
=
2
f
(
g
c
d
(
a
1
,
a
2
)
)
\Rightarrow gcd(2^{f(a_1)},2^{f(a_2)})=2^{gcd(f(a_1),f(a_2))}=2^{f(gcd(a_1,a_2))}
⇒gcd(2f(a1),2f(a2))=2gcd(f(a1),f(a2))=2f(gcd(a1,a2))
这样子问题就变得清晰了。只需要求出gcd(a1,a2,a3…ak)=d的数量,就可以分开来做了。
设F(d)为d|gcd(a1,a2,a3…)的数量,f(d)为我们要求的数量。那么有
F
(
d
)
=
∑
d
∣
k
n
f
(
k
)
F(d)=\sum_{d|k}^{n}{f(k)}
F(d)=∑d∣knf(k)
又有
F
(
d
)
=
C
n
d
+
k
−
1
k
−
1
F(d)=C_{\frac{n}{d}+k-1}^{k-1}
F(d)=Cdn+k−1k−1(组合数学的插板法),然后就可以开始我们的反演了。
f
(
d
)
=
∑
d
∣
m
n
μ
(
m
d
)
F
(
m
)
=
∑
d
∣
m
n
μ
(
m
d
)
C
n
m
+
k
−
1
k
−
1
f(d)=\sum_{d|m}^{n}{\mu(\frac{m}{d})F(m)}=\sum_{d|m}^{n}{\mu(\frac{m}{d})C_{\frac{n}{m}+k-1}^{k-1}}
f(d)=∑d∣mnμ(dm)F(m)=∑d∣mnμ(dm)Cmn+k−1k−1
然后枚举d,并用d的倍数对d进行更新,就可以在O(nlogn)的时间之内求出所有的f(d)。
然后再枚举d算出
2
f
(
g
c
d
(
d
)
)
2^{f(gcd(d))}
2f(gcd(d))就可以了。
9.GuGuFishtion (2018 Multi_University Training Contest 7)
题意:
定义
G
u
(
a
,
b
)
=
ϕ
(
a
b
)
ϕ
(
a
)
ϕ
(
b
)
Gu(a,b)=\frac{\phi(ab)}{\phi(a)\phi(b)}
Gu(a,b)=ϕ(a)ϕ(b)ϕ(ab),求
∑
a
=
1
m
∑
b
=
1
n
G
u
(
a
,
b
)
(
m
o
d
p
)
\sum_{a=1}^{m}\sum_{b=1}^{n}Gu(a,b)(mod\ p )
∑a=1m∑b=1nGu(a,b)(mod p)的值。
做法:
首先对Gu这个式子进行化简。
因为有phi函数的通项公式(可以网上查一下),然后打开再约分之后就有:
G
u
(
a
,
b
)
=
g
c
d
(
a
,
b
)
ϕ
(
g
c
d
(
a
,
b
)
)
Gu(a,b)=\frac{gcd(a,b)}{\phi(gcd(a,b))}
Gu(a,b)=ϕ(gcd(a,b))gcd(a,b)。这样我们就得到了:
A
n
s
=
∑
d
=
1
n
g
(
d
)
×
d
ϕ
(
d
)
Ans=\sum_{d=1}^{n}{{g(d)\times}\frac{d}{\phi(d)}}
Ans=∑d=1ng(d)×ϕ(d)d(g(d)表示gcd(x,y)=d的(x,y)的个数)
感觉又是老问题了…:
A
n
s
=
∑
d
=
1
n
d
ϕ
(
d
)
∑
d
∣
k
n
μ
(
k
d
)
⌊
n
k
⌋
⌊
m
k
⌋
Ans=\sum_{d=1}^{n}{\frac{d}{\phi(d)}\sum_{d|k}^{n}{\mu(\frac{k}{d})\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor}}
Ans=∑d=1nϕ(d)d∑d∣knμ(dk)⌊kn⌋⌊km⌋
然后就是
O
(
n
l
o
g
(
n
)
)
O(nlog(n))
O(nlog(n))的,可能有些卡,但是也没有办法呢~
有意义的例题集合
- BZOJ 2301 Problem b
- BZOJ 3529 数表
- BZOJ3994 [SDOI2015]约数个数和(较难)
- BZOJ4407 于神之怒(较难)
- bookshelf (2018 Multi_University Training Contest 6)(最后转化为求gcd(a,b)==k的数量)
- GuGuFishtion (2018 Multi_University Training Contest 7)
这篇博客真是肝得我心力憔悴啊…(;′д`)ゞ