大于 1 的、只被 1 和它本身整除的正整数
对于正整数 n,我们一定可以将其写为若干个质数的幂的乘积形式
即
同时该分解是唯一的
若有函数 f(n) f ( n ) 的定义域为正整数,值域为复数,称为数论函数
若数论函数 f(n) f ( n ) 满足:对于互质的 p、q p 、 q ,有 f(p⋅q)=f(p)⋅f(q) f ( p ⋅ q ) = f ( p ) ⋅ f ( q ) 称为积性函数
进一步地,若数论函数 f(n) f ( n ) 满足:对于任意 p、q p 、 q ,有 f(p⋅q)=f(p)⋅f(q) f ( p ⋅ q ) = f ( p ) ⋅ f ( q ) 称为完全积性函数
积性函数 f(1)=1 f ( 1 ) = 1
积性函数的乘积也是积性函数
常见的积性函数
除数函数 σk(n) σ k ( n ) ,表示n的约数的k次幂和
约数和函数 σ1(n) σ 1 ( n ) ,或 σ(n) σ ( n )
约数个数函数 τ(n) τ ( n ) ,一般也写为 d(n) d ( n )
欧拉函数 φ(n) φ ( n )
莫比乌斯函数 μ(n) μ ( n )
元函数 e e ,这是一个由命题映射到N的特殊函数,e[P]=1当且仅当P为真,否则e[P]=0
狄利克雷卷积单位函数 ε(n)=n==1?1:0 ε ( n ) = n == 1 ? 1 : 0
常函数 1(n)=1 1 ( n ) = 1
单位函数 id(n)=n i d ( n ) = n
加粗为完全积性函数
若
重要结论
∑d|nμ(d)=ε(n) ∑ d | n μ ( d ) = ε ( n )
证明:
n>1
首先不需要考虑含有平方因子的d
简单来说,就是一种运算
性质
1.积性函数的狄利克雷卷积仍然满足积性
2.完全积性函数的狄利克雷卷积不一定满足完全积性
3.Dirichlet 卷积同时也具有交换律、分配律
4.Dirichlet 卷积运算存在单位元: f⋅ε=ε⋅f=f f ⋅ ε = ε ⋅ f = f
h(n)=∑d|nf(d)ε(nd)=f(n) h ( n ) = ∑ d | n f ( d ) ε ( n d ) = f ( n )
筛法的重点不是筛什么,而是筛的顺序
比如埃氏筛和线性筛虽然大部分情况用于筛素数
但是其思想可以被运用到更广的领域
一些题会需要你在可以接受的复杂度内筛出需要的函数
这就需要筛法的思想
筛素数
for(int i=2;i<=e;++i)
if(!vis[i])
for(int j=i*i;j<=n;j+=i)
vis[j]=1;
复杂度 O(nloglogn) O ( n l o g l o g n )
以下证明其复杂度不超过 O(nln(n)) O ( n l n ( n ) )
∑ni=1ni=n∑ni=11i ∑ i = 1 n n i = n ∑ i = 1 n 1 i
Hn=∑i=11i H n = ∑ i = 1 1 i
Hn∼ln(n) H n ∼ l n ( n )
∴∑ni=1ni≤nln(n) ∴ ∑ i = 1 n n i ≤ n l n ( n )
形如埃氏筛的循环方式的复杂度 O(nln(n)) O ( n l n ( n ) )
筛欧拉函数
void euler(){
for(int i=1;i<=n;++i) phi[i]=i;
for(int i=2;i<=n;++i)
if(phi[i]==i)
for(int j=i;j<=n;j+=i) //必须从i开始
phi[j]=phi[j]/i*(i-1);
}
与筛素数的区别在于,一个数只要被标记一次即可认定它不是素数
而欧拉函数的计算必须考虑n的所有质因子的贡献
一种复杂度 O(n) O ( n ) ,基于积性函数的筛法
用处非常多,需要在理解的基础上记忆代码
筛素数
for(int i=2;i<=n;++i){
if(!vis[i]) p[++cnt]=i;
for(int j=1;j<=cnt&&i*p[j]<=n;++j){
vis[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
所以为什么是 O(n) O ( n ) 的?
每个数只会被其最小的质因子筛掉
break的原因:如果此时已经有i%p[j]==0,那么p[j+1],p[j+2]…就不可能再是i*p[j+1],i *p[j+2]的最小质因子
筛欧拉函数
phi[1]=1;
for(int i=2;i<=N;++i){
if(!vis[i]){
pri[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&1ll*i*pri[j]<=N;++j){
vis[i*pri[j]]=1;
if(i%pri[j]==0){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
}
phi,pri不要手残打反QWQ
解释一下第九行
此时的 pri[j] p r i [ j ] 一定是 i⋅pri[j] i ⋅ p r i [ j ] 的最小质因子
φ(i)=n⋅∏(1−1pj) φ ( i ) = n ⋅ ∏ ( 1 − 1 p j )
1−1pri[j] 1 − 1 p r i [ j ] 已经计算过
∴φ(i⋅phi[j])=phi[j]⋅φ(i) ∴ φ ( i ⋅ p h i [ j ] ) = p h i [ j ] ⋅ φ ( i )
筛莫比乌斯函数
mu[1]=1;
for(int i=2;i<=N;++i){
if(!vis[i]){
pri[++tot]=i;
mu[i]=-1;
}
for(int j=1;j<=tot&&1ll*i*pri[j]<=N;++j){
vis[i*pri[j]]=1;
if(i%pri[j]==0){
mu[i*pri[j]]=0;
break;
}
mu[i*pri[j]]=-mu[i];
}
}
基本上来说,线性筛积性函数只需要关注三个地方
质数怎么办,枚举到最小质因子怎么办,互质怎么办
还记得 ∑d|nμ(d)=ε(n) ∑ d | n μ ( d ) = ε ( n ) 吗
另外, f⋅ε=f f ⋅ ε = f
⋅ ⋅ 表示狄利克雷卷积(未必准确)
利用这些结论,如何证明:
若已知 g(m)=∑d|mf(d) g ( m ) = ∑ d | m f ( d ) ,如何推出 f(m)=∑d|mg(d)μ(md) f ( m ) = ∑ d | m g ( d ) μ ( m d )
若已知 f(m)=∑d|mg(d)μ(md) f ( m ) = ∑ d | m g ( d ) μ ( m d ) ,如何推出 g(m)=∑d|mf(d) g ( m ) = ∑ d | m f ( d )
以上便是莫比乌斯反演定理
即
若f⋅1=g 若 f ⋅ 1 = g
∴f⋅1⋅μ=g⋅μ ∴ f ⋅ 1 ⋅ μ = g ⋅ μ
∴f=g⋅μ ∴ f = g ⋅ μ
若g⋅μ=f 若 g ⋅ μ = f
∴g⋅μ⋅1=f⋅1 ∴ g ⋅ μ ⋅ 1 = f ⋅ 1
∴f⋅1=g ∴ f ⋅ 1 = g
比如现在有 ∑d|nφ(d)=n ∑ d | n φ ( d ) = n
可以表示成 ∑d|nφ(d)⋅1(n/d)=id(n) ∑ d | n φ ( d ) ⋅ 1 ( n / d ) = i d ( n )
可以得出 φ(n)=∑d|nμ(d)id(nd) φ ( n ) = ∑ d | n μ ( d ) i d ( n d )
另一个角度理解这个式子
尝试理解其实际含义,就像理解组合恒等式的实际意义
φ(12)=12φ(1)+6φ(2)+4φ(3)+3φ(4)+2φ(6)+1φ(12) φ ( 12 ) = 12 φ ( 1 ) + 6 φ ( 2 ) + 4 φ ( 3 ) + 3 φ ( 4 ) + 2 φ ( 6 ) + 1 φ ( 12 )
=12−6−4+0+2+0=4 = 12 − 6 − 4 + 0 + 2 + 0 = 4
对于一个数 m=∏ki=1pi m = ∏ i = 1 k p i
其中 ∀pi ∀ p i 是n的质因子
m对 φ(n) φ ( n ) 的贡献为:
−C1k+C2k−C3k⋯=−C0k=−1 − C k 1 + C k 2 − C k 3 ⋯ = − C k 0 = − 1
而这个数确实不是与n互质的数
莫比乌斯函数是与容斥原理有关的
有些题目同时可以从反演和容斥两个角度思考