一、前置知识
艾佛森括号
[P]={1if P is true0otherwise
其中 P 是一个可真可假的命题。
如 [114514≤1919810]=1,[−1∈N]=0。
二、加性函数
加性函数:对于 ∀n,m∈N∗,gcd(n,m)=1,若 f(n)+f(m)=f(nm),称函数 f 为加性函数;
注:此处加性函数指数论上的加性函数 (Additive function),应与代数中的加性函数 (Additive map) 区分。
完全加性函数:对于 ∀n,m∈N∗,若 f(n)+f(m)=f(nm),称函数 f 为完全加性函数。完全加性函数为加性函数的一种。
对于所有的加性函数,根据 f(1)=f(1×1)=f(1)+f(1) 可得 f(1)=0。
加性函数 f 满足 f(k∏i=1pαii)=k∑i=1f(pαii),完全加性函数 f 满足 f(k∏i=1pαii)=k∑i=1f(pαii)=k∑i=1f(pi)⋅αi。
证明时,先证明 f(1)=0。
然后证明加性需证明 gcd(n,m)=1 时 f(n)+f(m)=f(nm)(废话);
证明完全加性只需证明 f(n)+f(pi)=f(npi),pi∈P 即可,因为证明 f(n)+f(m)=f(nm) 可将 m 分解质因数再合并。
常见加性函数
常见完全加性函数
-
Ω(n)=∑p∈P∑pα∣n1(α>0) 表示 n 的总质因数个数
证明:
Ω(1)=∑p∈P∑pα∣11=0
首先由 pi∈P 有 Ω(pi)=∑p∈P∑pα∣pi1=1。
Ω(npi)=∑p∈P∑pα∣npi1=∑p∈P∧p≠pi∑pα∣npi1+∑pαi∣npi1=∑p∈P∧p≠pi∑pα∣n1+⎛⎝∑pαi∣n1+1⎞⎠=⎛⎝∑p∈P∧p≠pi∑pα∣n1+∑pαi∣n1⎞⎠+1=∑p∈P∑pα∣n1+1=Ω(n)+Ω(pi)
-
a0(n)=∑p∈P∑pα∣np 表示 n 的总质因数和
证明:
a0(1)=∑p∈P∑pα∣1p=0
首先由 pi∈P 有 a0(pi)=∑p∈P∑pα∣pip=pi。
a0(npi)=∑p∈P∑pα∣npip=∑p∈P∧p≠pi∑pα∣npip+∑pαi∣npipi=∑p∈P∧p≠pi∑pα∣np+∑pαi∣npi+pi=∑p∈P∑pα∣np+pi=a0(n)+a0(pi)
-
potp(n)(p∈P)=maxpk∣n{k} 表示使得 pk∣∣n(pk∣n,pk+1∤n) 的 k。
证明:
potp(1)=maxpk∣1{k}=0
首先由 p,pi∈P 有 potppi=maxpk∣pi{k}=[p=pi]。
当 p=pi 时:
potp(npi)=potpi(npi)=maxpki∣npi{k}=maxpki∣n{k}+1=potpi(n)+1=potp(n)+1
当 p≠pi 时:
potp(npi)=maxpk∣npi{k}=maxpk∣n{k}=potp(n)
所以有
potp(npi)=potp(n)+[p=pi]=potp(n)+potp(pi)
三、积性函数
积性函数:对于 ∀n,m∈N∗,gcd(n,m)=1, 若 f(n)f(m)=f(nm),称函数 f 为积性函数;
完全积性函数:对于 ∀n,m∈N∗,若 f(n)f(m)=f(nm),称函数 f 为完全积性函数。完全积性函数为积性函数的一种。
对于所有的积性函数,根据 f(1)=f(1×1)=f(1)f(1) 可得 f(1)=1。
注意:值恒等于 0 的函数一般不看作积性函数。
积性函数 f 满足 f(k∏i=1pαii)=k∏i=1f(pαii),完全积性函数 f 满足 f(k∏i=1pαii)=k∏i=1f(pαii)=k∏i=1f(pi)αi。
加性函数与积性函数的互相转化
若函数 f 为加性函数,函数 g 满足 g(n)=Cf(n),其中 C 为常数。
首先 g(1)=Cf(1)=C0=1;
当 gcd(n,m)=1 时,g(n)g(m)=Cf(n)+f(m),由 f 为加性函数可得 Cf(n)+f(m)=Cf(nm),即 g(n)g(m)=g(nm),所以函数 g 为积性函数。
同理,当函数 f 为完全加性函数时,函数 g 为完全积性函数。
证明时,先证明 f(1)=1。
然后证明积性需证明 gcd(n,m)=1 时 f(n)f(m)=f(nm);
证明完全积性只需证明 f(n)f(pi)=f(npi),pi∈P 即可,因为证明 f(n)f(m)=f(nm) 可将 m 分解质因数再合并。
常见积性函数
-
常数 k 固定时的最大公因数 gcd(k,n)
证明:
gcd(1,n)=1
当 gcd(n,m)=1 时,gcd(k,n)gcd(k,m)=gcd(k,nm)
-
欧拉函数 φ(n)=n∑i=1[gcd(i,n)=1]
或将 n 分解质因数 n=k∏i=1pαii 后 φ(n)=n⋅k∏i=1pi−1pi
证明:
φ(1)=1∑i=1[gcd(i,1)=1]=1
当 gcd(n,m)=1 时,
φ(n)φ(m)=n∑i=1[gcd(i,n)=1]m∑j=1[gcd(j,m)=1]=n∑i=1m∑j=1[gcd(i,n)=1][gcd(j,m)=1]=nm∑i=1[gcd(i,nm)=1] ⎛⎝不互质时为lcm(n,m)∑i=1[gcd(i,lcm(n,m))=1]⎞⎠=φ(nm) (不互质时为 φ(lcm(n,m)))
-
γ(n)=(−1)ω(n)
证明:
因为 ω 为加性函数,(−1) 为常数,所以 γ 为积性函数。
-
莫比乌斯函数 μ(n)=⎧⎨⎩1n=10∃d>1,d2∣nγ(n)otherwise
证明:
μ(1)=1
当 n,m 中有一者为 1 时,不妨设 n=1,则 μ(nm)=μ(m)=1⋅μ(m)=μ(n)μ(m);
当 ∃d>1,d2∣n 时,必有 ∃d>1,d2∣nm,则 μ(nm)=0=0⋅μ(m)=μ(n)μ(m);
否则,说明 μ(n)=γ(n),μ(m)=γ(m),当 gcd(n,m)=1 时,由 γ(n)γ(m)=γ(nm) 可得 μ(n)μ(m)=μ(nm)。
-
除数函数 σk(n)=∑d∣ndk,因数个数函数 d(n)=∑d∣n1=σ0(n),因数和函数 σ(n)=∑d∣nd=σ1(n)。
证明:
σk(1)=∑d∣1dk=1k=1
当 gcd(n,m)=1 时,
σk(n)σk(m)=∑d1∣ndk1∑d2∣mdk2=∑d1∣n∑d2∣mdk1dk2=∑d1∣n∑d2∣m(d1d2)k=∑d∣nmdk(不互质时不满足)=σk(nm)
常见完全积性函数
-
逆元 a−1modp(当逆元存在时)
证明:
a−1modp=1amodpb−1modp=1bmodp∴(a−1modp)⋅(b−1modp)=(1amodp)⋅(1bmodp)=(1a⋅1b)modp=1abmodp=(ab)−1modp
-
刘维尔函数 λ(n)=(−1)Ω(n)
证明:
因为 Ω 为完全加性函数,(−1) 为常数,所以 λ 为积性函数。
-
幂函数 Idk(n)=nk,常数函数 I(n) 或 1(n)=1=Id0(n),恒等函数 Id(n)=n=Id1(n);
证明:
Idk(1)=1k=1
Idk(n)Idk(m)=nkmk=(nm)k=Idk(nm)
-
单位函数 ε(n)=[n=1]。
证明:
ε(1)=[1=1]=1
ε(n)ε(m)=[n=1][m=1]=[nm=1]=ε(nm)
四、线性筛
主要是常见积性函数的,加性函数是类似的。
套路是在线性筛中
void pre(int n)
{
f[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
f[i] = ???;
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
f[i * p[j]] = ???;
break;
}
f[i * p[j]] = f[i] * f[p[j]];
}
}
}
像上面一样分类,原因是当 i % p[j] == 0
,即 pj∣i 时有 gcd(i,pj)>1,不满足积性,得单独处理;否则有 gcd(i,pj)=1,则 f(i)⋅f(pj)=f(i⋅pj)。
用线性筛,时间复杂度为 O(n)。
1. 最大公因数
-
i∈P
gcd(k,i) 暴力算是 O(logn) 的,由于 π(n)∼nlogn,所以所有质数暴力算是 O(n) 的。当然因为是质数你也可以用 if 来 O(1) 计算。
-
pj∤i
gcd(k,i⋅pj)=gcd(k,i)⋅gcd(k,pj)
-
pj∣i
- 若 pj∣kgcd(k,i),则 gcd(k,i⋅pj)=gcd(k,i)⋅pj
- 否则 gcd(k,i⋅pj)=gcd(k,i)
void pre(int n, int k)
{
gcd[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
if (i % k == 0)
{
gcd[i] = k;
}
else if (k % i == 0)
{
gcd[i] = i;
}
else
{
gcd[i] = 1;
}
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
gcd[i * p[j]] = ((k / gcd[i]) % p[j]) ? gcd[i] : (gcd[i] * p[j]);
break;
}
gcd[i * p[j]] = gcd[i] * gcd[p[j]];
}
}
}
2. 欧拉函数
-
i∈P
φ(i)=i−1
-
pj∤i
φ(i⋅pj)=φ(i)⋅φ(pj)
-
pj∣i
原来长这个样子:i⋅k∏x=1px−1px
现在是 (i⋅pj)⋅k∏x=1px−1px
φ(i⋅pj)=φ(i)⋅pj
void pre(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
}
3. 莫比乌斯函数
void pre(int n)
{
mu[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
mu[i] = -1;
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = mu[i] * mu[p[j]];
}
}
}
4. 因数个数函数
由算术基本定理得 n=k∏i=1pαii,那么我们知道 d(n)=k∏i=1(αi+1)。
设 num(n) 为 n 的最小质因数的次数,即 α1。
-
i∈P
d(i)=2
num(i)=1
-
pj∤i
d(i⋅pj)=d(i)⋅d(pj)
(i⋅pj) 的最小质因数为 pj,num(i⋅pj)=1
-
pj∣i
此时 pj 仍为最小质因数,故 α1 增加了一,d(i⋅pj)=d(i)α1+1⋅(α1+2)=d(i)num(i)+1⋅(num(i)+2)
num(i⋅pj)=num(i)+1
void pre(int n)
{
d[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
d[i] = 2;
num[i] = 1;
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
d[i * p[j]] = d[i] / (num[i] + 1) * (num[i] + 2);
num[i * p[j]] = num[i] + 1;
break;
}
d[i * p[j]] = d[i] * d[p[j]];
num[i * p[j]] = 1;
}
}
}
5. 因数和函数
首先 σ(n)=k∏i=1αi∑j=0pji。
设 num(n) 为 n 的最小质因数 p1 的 α1∑i=0pi1。
-
i∈P
σ(i)=num(i)=i+1
-
pj∤i
σ(i⋅pj)=σ(i)⋅σ(pj)
num(i⋅pj)=1+pj
-
pj∣i
p1 这一项从 αi∑i=0pi1 变成 αi+1∑i=0pi1,那么将原来的集体乘 p1 再加 1 即可。
σ(i⋅pj)=σ(i)α1∑k=0pk1⋅α1+1∑k=0pk1=σ(i)num(i)⋅[num(i)⋅pj+1]
num(i⋅pj)=num(i)⋅pj+1
UVA1730 Sum of MSLCM(终于有题写了
void pre(int n)
{
sigma[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
p[++p[0]] = i;
sigma[i] = i + 1;
num[i] = i + 1;
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
{
vis[i * p[j]] = true;
if (i % p[j] == 0)
{
sigma[i * p[j]] = sigma[i] / num[i] * (num[i] * p[j] + 1);
num[i * p[j]] = num[i] * p[j] + 1;
break;
}
sigma[i * p[j]] = sigma[i] * sigma[p[j]];
num[i * p[j]] = 1 + p[j];
}
}
}
五、参考资料
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现