整理的算法模板合集: ACM模板
实际上是一个全新的精炼模板整合计划
写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无任何商业用途。因个人实力时间等原因,本文并非完全原创,请大家见谅。
《算法竞赛中的初等数论》正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)
《算法竞赛中的初等数论》(信奥 / 数竞 / ACM)前言、后记、目录索引(十五万字符的数论书)
全文目录索引链接: https://fanfansann.blog.csdn.net/article/details/113765056
本章内容不多,比较简单,非常基础,建议完全掌握,包括所有的概念和证明。
0x30 积性函数
一些定义
-
数论函数
定义域为正整数的函数称为数论函数。 -
积性函数
对于数论函数 f f f,若任意互质的 p , q p,q p,q 都有 f ( p q ) = f ( p ) f ( q ) f(pq)=f(p)f(q) f(pq)=f(p)f(q),则称 f f f 是积性函数。 -
完全积性函数
对于数论函数 f f f,若任意 p , q p,q p,q 都有 f ( p q ) = f ( p ) f ( q ) f(pq)=f(p)f(q) f(pq)=f(p)f(q),则称 f f f 是完全积性函数 -
定义逐点加法
( f + g ) ( x ) = f ( x ) + g ( x ) (f + g)(x) = f(x) + g(x) (f+g)(x)=f(x)+g(x), ( f ⋅ g ) ( x ) = f ( x ) g ( x ) (f \cdot g)(x) = f(x)g(x) (f⋅g)(x)=f(x)g(x)
定理30.1: 积性函数一定满足 f ( 1 ) = 1 f(1) = 1 f(1)=1。
考虑证明:
显然 1 1 1 与任何数都互质,满足积性函数的定义,那么我们假设存在一个正整数 a a a 满足 f ( a ) ! = 0 f(a)!=0 f(a)!=0,显然有: f ( a ) = f ( 1 ∗ a ) = f ( 1 ) f(a) = f(1*a) = f(1) f(a)=f(1∗a)=f(1),两端同除 f ( a ) f(a) f(a) ,得: f ( 1 ) = 1 f(1) = 1 f(1)=1,性质得证 □
定理30.2: 对于一个大于 1 1 1的正整数 N N N ,根据唯一分解定理有 N = ∏ p i a i N = \prod p_i^{a_i} N=∏piai ,则对于任意积性函数 f f f ,有: f ( N ) = f ( ∏ p i a i ) = ∏ f ( p i a i ) \displaystyle f(N) = f(\prod p_i^{a_i}) = \prod f(p_i^{a_i}) f(N)=f(∏piai)=∏f(piai)若 f f f完全积性,则 f ( N ) = ∏ f ( p i ) a i \displaystyle f(N) = \prod f(p_i)^{a_i} f(N)=∏f(pi)ai。
由此可得推论:凡是积性函数均可用线性筛法求解
性质30.3: 对于一个大于 1 1 1 的整数由唯一分解定理有: n = ∏ p i a i n = \prod p_i^{a_i} n=∏piai,其中 p i p_i pi 为互不相同的素数。
-
那么对于一个积性函数 f f f, f ( n ) = f ( ∏ p i a i ) = ∏ f ( p i a i ) f(n) = f(\prod p_i^{a_i}) = \prod f(p_i^{a_i}) f(n)=f(∏piai)=∏f(piai)
-
对于一个完全积性函数 f f f, f ( n ) = ∏ f ( p i ) a i f(n) = \prod f(p_i)^{a_i} f(n)=∏f(pi)ai
性质30.4: 若 f f f, g g g 为积性函数,则 f ∗ g f * g f∗g 也为积性函数。
0x31 常见积性函数
-
φ ( n ) φ(n) φ(n) -欧拉函数 φ ( n ) = ∑ i = 1 n [ i ⊥ n ] \displaystyle\varphi(n)=\sum_{i=1}^n[i\perp n] φ(n)=i=1∑n[i⊥n]
-
μ ( n ) μ(n) μ(n) -莫比乌斯函数,关于非平方数的质因子数目
-
g c d ( n , k ) gcd(n,k) gcd(n,k) -最大公因数,当 k k k 固定的情况
-
d ( n ) d(n) d(n) - n n n 的正因子数目 d ( n ) = ∑ i ∣ n 1 d(n)=\displaystyle\sum_{i|n}1 d(n)=i∣n∑1
-
σ ( n ) σ(n) σ(n) - n n n 的所有正因子之和 σ ( n ) = ∑ d ∣ n d \displaystyle \sigma(n)=\sum_{d|n}d σ(n)=d∣n∑d
-
σ k ( n ) σk(n) σk(n) - 因子函数, n n n 的所有正因子的 k k k 次幂之和,当中 k k k 可为任何复数。
-
1 ( n ) 1(n) 1(n) -不变的函数,定义为 1 ( n ) = 1 \displaystyle 1(n) = 1 1(n)=1 (完全积性)
-
i d ( n ) id(n) id(n) -单位函数(恒等函数),定义为 i d ( n ) = n id(n) = n id(n)=n(完全积性)
-
i d k ( n ) idk(n) idk(n) -幂函数,对于任何复数、实数 k k k,定义为 i d k ( n ) = n k idk(n) = n^k idk(n)=nk (完全积性)
-
ε ( n ) ε(n) ε(n) -定义为: ε ( n ) = [ n = 1 ] ε(n)=[n=1] ε(n)=[n=1],若 n = 1 n = 1 n=1, ε ( n ) = 1 ε(n)=1 ε(n)=1;若 n > 1 n > 1 n>1, ε ( n ) = 0 ε(n)=0 ε(n)=0 。即: 对于狄利克雷卷积的乘法单位 / 狄利克雷特卷积的单位元,(完全积性)
-
λ ( n ) λ(n) λ(n) -刘维尔函数,关于能整除 n n n 的质因子的数目
-
γ ( n ) γ(n) γ(n),定义为 γ ( n ) = ( − 1 ) ω ( n ) \displaystyle γ(n)=(-1)^ω(n) γ(n)=(−1)ω(n),在此加性函数 ω ( n ) ω(n) ω(n) 是不同能整除 n n n 的质数的数目
-
另外,所有狄利克雷特征均是完全积性的。
积性函数的逆元: 对每个 f ( 1 ) ≠ 0 f(1)\neq0 f(1)=0 的积性函数 f f f ,都存在一个函数 g g g 使得 f ∗ g = ϵ f\ast\ g=\epsilon f∗ g=ϵ,则称函数 g g g 为 函数 f f f 的逆元。
根据定义显然有
ϵ = g ∗ f [ n = 1 ] = ∑ i ∣ n f ( i ) g ( n i ) [ n = 1 ] = f ( 1 ) g ( n ) + ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i )
化简即可得到:
g ( n ) = [ n = 1 ] − ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) f ( 1 ) \displaystyle g(n)=\cfrac { [n=1]-\displaystyle\sum_{i\mid n, i\neq1}\ f(i)\ g(\cfrac {n}{i}) }{\ f(1)} g(n)= f(1)[n=1]−i∣n,i=1∑ f(i) g(in)
积性函数 欧拉函数 已在 0x14.1 欧拉函数 中讲解过,这里不再赘述。
0x32 莫比乌斯函数
定义
μ ( n ) = { 0 ∃ i ∈ [ 1 , m ] , C i > 1 ( − 1 ) m ∀ i ∈ [ 1 , m ] , C i = 1 \mu(n) = \left\{
构造莫比乌斯函数
莫比乌斯函数可以理解为一个容斥原理的映射
- 性质:
∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n} \mu(d)=[n=1] d∣n∑μ(d)=[n=1]
也可以表示为: ε = μ ∗ I ε = μ*I ε=μ∗I,其中 ∗ * ∗ 是指 D i r i c h l e t Dirichlet Dirichlet 卷积。
(证明:使用唯一分解定理 + 二项式定理即可证明,这里不再展开)
- 补充结论:
[ g c d ( i , j ) = 1 ] = ε [ g c d ( i , j ) ] = μ ∗ I = ∑ d ∣ g c d ( i , j ) μ ( d ) [gcd(i,j)=1]=ε[gcd(i,j)]=\mu *I=\sum_{d|gcd(i,j)}\mu(d) [gcd(i,j)=1]=ε[gcd(i,j)]=μ∗I=d∣gcd(i,j)∑μ(d) - 证明 μ ( x ) \mu(x) μ(x) 是积性函数
a = p 1 α 1 × p 2 α 2 × ⋯ × p n α k a=p_1^{\alpha_1}\times p_2^{\alpha_2}\times \cdots \times p_n^{\alpha_k} a=p1α1×p2α2×⋯×pnαk
b = p 1 β 1 × p 2 β 2 × ⋯ × p n β t b=p_1^{\beta_1}\times p_2^{\beta_2}\times \cdots \times p_n^{\beta_t} b=p1β1×p2β2×⋯×pnβt
a × b = p 1 α 1 × p 2 α 2 × ⋯ × p n α k × p 1 β 1 × p 2 β 2 × ⋯ × p n β t a\times b=p_1^{\alpha_1}\times p_2^{\alpha_2}\times \cdots \times p_n^{\alpha_k}\times p_1^{\beta_1}\times p_2^{\beta_2}\times \cdots \times p_n^{\beta_t} a×b=p1α1×p2α2×⋯×pnαk×p1β1×p2β2×⋯×pnβt
若 μ ( a ) = 0 \mu(a)=0 μ(a)=0或 μ ( b ) = 0 \mu(b)=0 μ(b)=0,则 μ ( a × b ) = 0 \mu(a\times b)=0 μ(a×b)=0(因为均含 α or β > 1 \alpha\ \text{or}\ \beta>1 α or β>1)
即 μ ( a × b ) = μ ( a ) × μ ( b ) \mu(a\times b)=\mu(a) \times \mu(b) μ(a×b)=μ(a)×μ(b)
若 μ ( a ) ≠ 0 \mu(a)≠0 μ(a)=0或 μ ( b ) ≠ 0 \mu(b)≠0 μ(b)=0,则 μ ( a × b ) = ( − 1 ) k + t = ( − 1 ) k × ( − 1 ) t = μ ( a ) × μ ( b ) \mu(a\times b)=(-1)^{k+t}=(-1)^{k}\times(-1)^t=\mu(a) \times \mu(b) μ(a×b)=(−1)k+t=(−1)k×(−1)t=μ(a)×μ(b)
0x33 狄利克雷卷积
- 定义: 若函数 f , g f,g f,g为积性函数,则定义 f , g f,g f,g 的狄利克雷卷积为:
f ∗ g ( n ) = ∑ d ∣ n f ( d ) g ( n d ) f*g(n)=\sum_{d|n}f(d)g(\frac nd) f∗g(n)=d∣n∑f(d)g(dn)
计算的时候可以把枚举约数转换成枚举倍数,以调和级数 O ( n l o g n ) O(nlogn) O(nlogn) 的复杂度求出 f ∗ g f∗g f∗g 的前 n n n 项。详见本文 0x33.2 O ( n l o g n ) O(nlogn) O(nlogn) 的卷积预处理
- 满足性质:
交换律:
f ∗ g ( n ) = ∑ d ∣ n f ( d ) g ( n d ) = ∑ d ∣ n g ( d ) f ( n d ) = g ∗ f ( n ) f*g(n)=\sum_{d|n}f(d)g(\frac nd)=\sum_{d|n}g(d)f(\frac nd)=g*f(n) f∗g(n)=d∣n∑f(d)g(dn)=d∣n∑g(d)f(dn)=g∗f(n)
结合律:
f ∗ g ∗ h ( n ) = ∑ d ∣ n f ( d ) ∑ t ∣ n d g ( t ) h ( n d t ) = ∑ d 1 d 2 d 3 = n f ( d 1 ) g ( d 2 ) h ( d 3 ) = f ∗ ( g ∗ h ) ( n ) f*g*h(n)=\sum_{d|n}f(d)\sum_{t|\frac nd}g(t)h(\frac n{dt})=\sum_{d_1d_2d_3=n}f(d_1)g(d_2)h(d_3)=f*(g*h)(n) f∗g∗h(n)=d∣n∑f(d)t∣dn∑g(t)h(dtn)=d1d2d3=n∑f(d1)g(d2)h(d3)=f∗(g∗h)(n)
分配律: f ∗ ( g + h ) = f ∗ g + f ∗ h f * (g + h) = f * g + f * h f∗(g+h)=f∗g+f∗h
单位元: f ∗ ε = f f*\varepsilon=f f∗ε=f
重要性质: 若函数 f , g f,g f,g为积性函数,则 f ∗ g f*g f∗g也为积性函数( *
为狄利克雷特卷积)
0x33.1 常见积性函数的卷积
性质0x33.1: ∀ f ( n ) , e ∗ f ( n ) = f ( n ) \forall f(n),e*f(n)=f(n) ∀f(n),e∗f(n)=f(n)
性质0x33.2: 1 ∗ 1 ( n ) = ∑ d ∣ n 1 = d ( n ) 1*1(n)=\sum_{d|n}1=d(n) 1∗1(n)=∑d∣n1=d(n)
性质0x33.3: i d ∗ 1 ( n ) = ∑ d ∣ n d = σ ( n ) id*1(n)=\sum_{d|n}d=\sigma(n) id∗1(n)=∑d∣nd=σ(n)
性质0x33.4: μ ∗ 1 ( n ) = ∑ d ∣ n μ ( d ) × 1 ( n d ) = [ n = 1 ] = ε ( n ) \mu*1(n)=\sum_{d|n}\mu(d)\times 1(\cfrac{n}{d})=[n=1]=\varepsilon(n) μ∗1(n)=∑d∣nμ(d)×1(dn)=[n=1]=ε(n)
性质0x33.4证明:
由唯一分解定理: n = p 1 k 1 p 2 k 2 … p m k m n=p_1^{k_1}p_2^{k_2}\dots p_m^{k_m} n=p1k1p2k2…pmkm
代入上式得:
μ ∗ 1 ( n ) = ∑ d ∣ n μ ( d ) × 1 ( n d ) = ∑ C 1 = 0 k 1 ∑ C 2 = 0 k 2 ⋯ ∑ C m = 0 k m μ ( p 1 C 1 p 2 C 2 … p m C m )μ∗1(n)=d∣n∑μ(d)×1(dn)=C1=0∑k1C2=0∑k2⋯Cm=0∑kmμ(p1C1p2C2…pmCm)我们分析该和式的实际意义,显然当某个质因子数量 c i > 1 c_i>1 ci>1,则 μ \mu μ 的值为 0 0 0。
这样的话,我们就可以去掉无用的枚举( μ = 0 \mu=0 μ=0),利用二项式定理证明:μ ∗ 1 ( n ) = ∑ C 1 = 0 1 ∑ C 2 = 0 1 ⋯ ∑ C m = 0 1 μ ( p 1 C 1 p 2 C 2 … p m c m ) = ∑ C 1 = 0 1 ∑ C 2 = 0 1 ⋯ ∑ C m = 0 1 ( − 1 ) ∑ i = 1 m C i = ∑ i = 0 m ( − 1 ) i ( m i ) = [ m = 0 ] = [ n = 1 ] = ε ( n )
μ∗1(n)=C1=0∑1C2=0∑1⋯Cm=0∑1μ(p1C1p2C2…pmcm)=C1=0∑1C2=0∑1⋯Cm=0∑1(−1)∑i=1mCi=i=0∑m(−1)i(im)=[m=0]=[n=1]=ε(n)
性质0x33.5: φ ∗ 1 ( n ) = ∑ d ∣ n φ ( d ) = n = i d ( n ) \varphi*1(n)=\sum_{d|n}\varphi(d)=n=id(n) φ∗1(n)=∑d∣nφ(d)=n=id(n)
性质0x33.5证明:
∵ φ = μ ∗ i d , ϵ = μ ∗ 1 ∴ 1 ∗ φ = 1 ∗ μ ∗ i d ∴ 1 ∗ φ = ϵ ∗ i d = i d ( n ) ∴ ∑ d ∣ n φ ( d ) = n∵φ=μ∗id,ϵ=μ∗1∴1∗φ=1∗μ∗id∴1∗φ=ϵ∗id=id(n)∴d∣n∑φ(d)=n
积性函数的转换关系:
μ ⇒ ∗ 1 ⇒ ε ⇒ ∗ 1 ⇒ 1 ⇒ ∗ 1 ⇒ d \mu \Rightarrow^{*1}\Rightarrow \varepsilon\Rightarrow^{*1}\Rightarrow 1 \Rightarrow^{*1}\Rightarrow d μ⇒∗1⇒ε⇒∗1⇒1⇒∗1⇒d
φ ⇒ ∗ 1 ⇒ i d ⇒ ∗ 1 ⇒ σ \varphi\Rightarrow^{*1}\Rightarrow id\Rightarrow^{*1}\Rightarrow \sigma φ⇒∗1⇒id⇒∗1⇒σ
反方向的转换关系:
μ ⇐ ∗ μ ⇐ ε ⇐ ∗ μ ⇐ 1 ⇐ ∗ μ ⇐ d \mu\Leftarrow^{*\mu}\Leftarrow \varepsilon\Leftarrow^{*\mu}\Leftarrow 1\Leftarrow^{*\mu}\Leftarrow d μ⇐∗μ⇐ε⇐∗μ⇐1⇐∗μ⇐d
φ ⇐ ∗ μ ⇐ i d ⇐ ∗ μ ⇐ σ \varphi\Leftarrow^{*\mu}\Leftarrow id\Leftarrow^{*\mu}\Leftarrow \sigma φ⇐∗μ⇐id⇐∗μ⇐σ
0x33.2 O ( n l o g n ) O(nlogn) O(nlogn) 的卷积预处理
若已知数论函数 f , g f, g f,g ,我么可以将枚举约数转换成枚举倍数,以调和级数 O ( n l o g n ) O(nlogn) O(nlogn) 的复杂度求出 f ∗ g f∗g f∗g 的前 n n n 项 :
h ( n ) = f ∗ g ( n ) = ∑ d ∣ n f ( d ) g ( n d ) h(n)=f * g(n)=\sum_{d\ |\ n}f(d)g(\cfrac{n}{d}) h(n)=f∗g(n)=d ∣ n∑f(d)g(dn)
int f[N], g[N], h[N];
inline void init(int n) {
for (int i = 1; i * i <= n; i++) {
for (int j = i; i * j <= n; j++) {
if (j == i) h[i * j] += f[i] * g[i];
else h[i * j] += f[i] * g[j] + f[j] * g[i];
}
}
}
- 竞赛例题选讲
Problem A. Longge的问题 (BZOJ 2705[SDOI2012])
Problem
Solution
Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 50007;
int n, m, t;
int ans;
int get_phi(int n)
{
int ans = n;
for(int i = 2; i * i <= n; ++ i) {
if(n % i == 0) {
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
signed main()
{
scanf("%lld", &n);
int ans = 0;
for(int i = 1; i * i <= n; ++ i) {
if(n % i == 0) {
ans += n / i * get_phi(i);
if(i * i != n) {
ans += i * get_phi(n / i);
}
}
}
printf("%lld\n", ans);
return 0;
}
Problem B. Clarke and math(HDU 5628 )
给定 f ( i ) f(i) f(i), ( i = 1 , 2 , … , n ) (i=1,2,…,n) (i=1,2,…,n)
求:
g ( i ) = ∑ i 1 ∣ i ∑ i 2 ∣ i 1 ∑ i 3 ∣ i 2 ⋯ ∑ i k ∣ i k − 1 f ( i k ) m o d 1000000007 ( 1 ≤ i ≤ n ) \displaystyle g(i)=\sum_{i_1∣i}\sum_{i_2∣i_1}\sum_{i_3∣i_2}⋯\sum_{i_k∣i_{k-1}}f(i_k) \mod 1000000007(1≤i≤n) g(i)=i1∣i∑i2∣i1∑i3∣i2∑⋯ik∣ik−1∑f(ik)mod1000000007(1≤i≤n)
Solution
显然题目中要求的式子就是 f ∗ 1 k f*1^k f∗1k,使用快速幂加速即可。
Code
待更…
Problem C.
建议阅读的拓展内容:浅谈一类积性函数的前缀和
%https://blog.csdn.net/qq_37451344/article/details/81843722?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-13.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-13.control
%https://www.cnblogs.com/Milkor/p/4474835.html
转载:https://blog.csdn.net/weixin_45697774/article/details/114975467