(别问我为什么这么眼熟,我是贺的cmd的博客
狄利克雷卷积与数论函数
定义:数论函数,就是值域为整数的函数
两个数论函数的狄利克雷卷积是一个新函数。
比如f(n),g(n)的狄利克雷卷积写成f∗g
定义(f∗g)(n)=∑d∣nf(d)g(n/d)(就是f数组的d乘上g数组的n/d
(f∗g)(10)=f(1)g(10)+f(2)g(5)+f(5)g(2)+f(10)g(1)
狄利克雷卷积满足交换律和结合律
f∗g=g∗f
(f∗g)∗h=f∗(g∗h)
几个简单的数论函数
I(n)恒等于1,称作恒等函数
ϵ(n)或者说e(n)当n等于1的时候为1,否则是0,被称作元函数,因为它是卷积的单位元(ϵ∗f)=f (重要)
id(n)=n被称作单位函数
上述三个都是完全积性函数
定义:完全积性函数:对于任意的整数a,b有的I(ab)=I(a)∗I(b)
附上两个后面会讲的例子:
φ(n)欧拉函数
μ(n)被称作莫比乌斯函数
这两个函数是积性函数
定义:积性函数:对于一个函数F,如果说gcd(a,b)=1时F(ab)=F(a)∗F(b)就是积性函数
下面是一些性质:
莫比乌斯反演的公式
有两个函数F,f
设两个函数有如下关系:F(n)=∑d∣nf(d)
那么:F(n)=∑d∣n(1∗f(d))
也就相当于:F=I∗f
现在如果说有f函数就可以求出来F函数了
但是如果有了F函数,求f咋办?求逆?
啊对F=I∗f,f=F∗I−1
mobius把I−1命名为μ
问题是这个函数咋求?
他是个积性函数(因为上面有说过,积性函数的逆还是积性函数
在研究一个积性函数的时候,先研究它在质数的幂的时候的表现
比如说μ(pk)(p是质数)
k = 0的时候,μ(1)=1
k = 1的时候,由于∑d∣pI(d)μ(p/d)=e(p)=0所以μ(p)=−1
k>1的时候,还是等于0
然后定义慢慢慢慢的出来:
μ(x)=0(当x可以被一个大于1的某个正数的平方整除的话
μ(x)=(−1)kk为x含有的质因子的种类数
然后我们来康康莫比乌斯的反演公式:
-
嵌入式莫比乌斯反演
我们从μ∗I=e得:∑d∣nμ(d)=[n=1](这个中括号是用来判断真假的)
注意到[n∣m][n/m=1]=[n=m]
则有:[n∣m]∑d∣(n/m)μ(d)=[n=m]
-
约数的莫反
若:F(n)=∑d∣nf(d)
则:f(n)=∑d∣nμ(d)F(n/d)
又作f(n)=∑d∣nμ(n/d)F(d)(等价
根据μ=I−1有f∗I=F−>f=F∗μ
-
倍数的莫比乌斯反演
若:F(n)=∑n∣df(d)
则:f(n)=∑n∣dμ(d/n)F(d)
并不是狄利克雷卷积的形式,狄利克雷一般后边F应该是F(n)
又作F(n)=∑k∞f(kn)与f(n)=∑k∞μ(k)F(kn)
整除分块:
cmd
莫反基本上所有的题都要整除分块……因为复杂度问题
其他的数论函数
- 恒等函数: I(n),永远等于1,完全积性
- 元函数:ϵ(n)当n=1的时候为1否则是0 完全积性
- 单位函数:id(n)函数值为n,完全积性
- 幂函数:idx(n)函数值为nx完全积性
- 莫比乌斯函数:μ(n)μ∗I=ϵ积性
- 欧拉函数:φ(n)小于等于n的所有数字中和n互质的 积性
- 约数个数函数:d(n)n的约数个数 积性
- 约数和函数:σ(n)n的约数和 积性
- 除数函数:σk(n)n的约数k次方和 积性
φ的性质:
- 积性函数
- φ(pk)=(p−1)pk−1(p质数)
- p∣n,φ(np)=φ(n)∗p(p质数)
- φ(n=p1k1p2k2...pmkm=n∗(p1p1−1∗p2p2−1∗...∗pmpm−1))
一些狄利克雷卷积结论:
- id=I∗φ
- 等价于:id∗μ=φ
这个结论在求∑i=1n∑j=1m的时候:
d=1∑nd∗t=1∑n/dμ(t)(n/dt)(m/dt)(莫反)设p=dt,原式=d=1∑nd∗d∣p∑nμ(p/d)(n/p)(m/p)=p=1∑nd∣p∑d∗μ(p/d)(n/p)(m/p)=p=1∑nφ(p)(n/p)(m/p)
除数函数相关:
- d=I∗I
- σ=id∗I
- d(n)=(k1+1)(k2+1)...(km+1)
- σ(n)=(1+p1+p12+...+p1k1)(1+p1+p22+...+p2k2)...(1+pm+pm2+...+pmkm)
- ∑i=1nd(n)=∑i=1n(n/i)
- d(ij)=∑x∣i∑y∣j[x⊥y]
- φ(ij)=φ((i,j))φ(i)φ(j)(i,j)
题目
P3455
这个题比较偏板子一点
我们把题目写出来:求∑i=1n∑j=1m[gcd(i,j)==d]
当然我们可以直接转换拉:∑i=1n/d∑j=1m/d[gcd(i,j)==1]
下面的n,m都除以d
用嵌入式反演转换:
i=1∑nj=1∑md∣gcd(i,j)∑μ(d)
然后我们交换求和的顺序:
∑d=1min(n,m)μ(d)∑d∣in∑d∣jm1
然后我们想到,小于等于n或者m的可以整除d的数字个数是有限的:
∑d=1min(n,m)(n/d)(m/d)μ(d)
然后整除分块
P2257
首先一样是把题目整理一遍:
∑i=1n∑j=1m[gcd(i,j)==p]
当然了,我们像是上面一道题一样转化一下:
ans=∑p∈prime∑i=1n/p∑j=1m/p∑d∣gcd(i,j)μ(d)=∑p∈prime∑d=1min(n/p,m/p)μ(d)∗(n/dp)∗(m/dp)
然后我们就考虑一下,枚举T = dp
∑T=1min(n,m)(n/T)(m/T)∑p∈prime,p∣Tμ(pT)
前面的部分显然是可以整除分块的,后面的预处理出来,枚举p然后枚举p的倍数
P5221
把式子改变:∏i=1n∏j=1ngcd(i,j)2i∗j并且模数是个质数
我们就分开求呗,上面那个好说:(n!)2n
下边那个难:我们考虑求出来gcd是d的数对个数之后就可以求出来积(快速幂
所以我们设G(x,y)表示∑i=1y∑j=1y[gcd(i,j)==x]
那么原式就可以变成:∏i=1niG(i,n)
但是我们并不能把所有的G(1...n,n)求出来因为复杂度非常不对劲
但是把改一下G(i,n)=G(1,n/i)呢……
所以我们能求出来G(1,n)就好了
然后我们考虑设f(x)=∑i=1n∑j=1n[x∣gcd(i,j)],F(x)=∑i=1n∑j=1n[x==gcd(i,j)]
但是显然……f[x]=∑x∣dF[d]
然后反演啊:F[d]=∑d∣nμ(n/d)f(n)
显然F函数就是G
那么我们就进行求解:f(x)=(n/x)2
F[1]=∑d=1nμ(d)f(d)=∑d=1nμ(d)(n/d)2
然后对n/d进行整除分块
然后在求F数组的时候,对于每一个x求一遍是不优的
我们发现n/x只有根号n种取值,还可以再开一次整除分块……
P3172
我们这么考虑:对于我们先求出来公约数为k的,然后减去它的倍数就好对吧(容斥
由于h−l≤1e5所以我们可以直接枚举gcd因为gcd一定小于等于两数之差(更相减损
枚举了之后减去倍数的答案就好,注意倒序枚举
P2522
这个题……
我们考虑,a−b,c−d是不是可以用1−b,1−d减去1−(b−1),1−d减去1−b,1−(d−1)加上1−(c−1),1−(d−1)
就完了
P3372
这个题……非常好
d(ij)=∑x∣i∑y∣j[gcd(x,y)=1]
∑i=1n∑j=1md(ij)=∑i=1∑j=1∑x∣i∑y∣j[gcd(x,y)=1]
改变求和顺序:
∑x=1n∑y=1m(n/x)(m/y)[gcd(x,y)=1]
然后莫反一下
设g(x)=∑x∣df(d)
g(x)=∑i=1n∑j=1m(n/i)(m/i)[x∣gcd(i,j)]=∑i=1n/x∑j=1m/x(n/ix)(m/jx)
f(1)=∑i=1nμ(i)g(i)
g函数整除分块就好了=-
1829
套路:
推式子开始:(假设n<m)
i=1∑nj=1∑mlcm(i,j)=i=1∑nj=1∑mgcd(i,j)i∗j=d=1∑nd∗i=1∑nj=1∑m[gcd(i,j)==d]∗i∗j/d2=d=1∑nd∗i=1∑n/dj=1∑m/d[gcd(i,j)==1]∗i∗j
然后我们把d后边的那点东西拿出来,假设n = n/d,m = m/d
i=1∑nj=1∑m[gcd(i,j)==1]∗i∗j=i=1∑nj=1∑md∣gcd(i,j)∑μ(d)∗i∗j=d=1∑nμ(d)i=1,d∣i∑nj=1,d∣j∑mi∗j=d=1∑nμ(d)∗d2i=1∑n/dj=1∑m/di∗j
前面的关于d的东西我们可以前缀和(线性筛的时候前缀和
后边的可以直接一个式子算出来
这个后边的东西就可以O(1)求出来了
整个的东西用一次整除分块
那么把这个东西设成sum(n,m)的话,原式变成:∑d=1nd∗sum(n/d,m/d)
我们惊喜的发现,这玩意又是一个整除分块啊
然后O(n)的复杂度就可以做了
P3704
这个题我们对于每一个f都记录一下用过多少次
先提示一下复杂度:(nlogn+n∗q)
再提示一下瓶颈:调和级数
好了开始推式子
我们可以把式子写成这个样子:(默认n<m)
d=1∏nf[d]i=1∏nj=1∏m[gcd(i,j)==d]=d=1∏nf[d]∑i=1n/d∑j=1m/d[gcd(i,j)==1]
里层外层函数可以各用一次整除分块,这样可以得到O(n)的做法(其实考场上想到这里就可以先放一放了,因为有70分了
把上面的东西拿出来:
i=1∑n/dj=1∑m/d[gcd(i,j)==1]=i=1∑n/dj=1∑m/dt∣gcd(i,j)∑μ(t)=t=1∑n/dμ(t)(n/dt)(m/dt)
这个东西很好用啊,因为后边有个dt,我们把dt设成T
T=1∏n(d∣T∏f[d]μ(T/d))(n/T)(m/T)
然后我们对n/T,m/T进行整除分块,d的东西咋办啊,我们发现T最大是1e6的,那么我们调和级数算出来每一个T对应的里面的东西就好啦……