飞道的博客

《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)

300人阅读  评论(0)

整理的算法模板合集: 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) (fg)(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(1a)=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 fg 也为积性函数。

0x31 常见积性函数

  • φ ( n ) φ(n) φ(n) -欧拉函数 φ ( n ) = ∑ i = 1 n [ i ⊥ n ] \displaystyle\varphi(n)=\sum_{i=1}^n[i\perp n] φ(n)=i=1n[in]

  • μ ( 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)=in1

  • σ ( n ) σ(n) σ(n) n n n 的所有正因子之和 σ ( n ) = ∑ d ∣ n d \displaystyle \sigma(n)=\sum_{d|n}d σ(n)=dnd

  • σ 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 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 )
ϵ[n=1][n=1]=gf=inf(i) g(in)=f(1) g(n)+in,i=1 f(i) g(in)

化简即可得到:

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]in,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\{

0 i [ 1 , m ] , C i > 1 ( 1 ) m i [ 1 , m ] , C i = 1
\right. μ(n)={ 0(1)mi[1,m],Ci>1i[1,m],Ci=1

构造莫比乌斯函数

莫比乌斯函数可以理解为一个容斥原理的映射

  • 性质:
    ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n} \mu(d)=[n=1] dnμ(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=dgcd(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) fg(n)=dnf(d)g(dn)

计算的时候可以把枚举约数转换成枚举倍数,以调和级数 O ( n l o g n ) O(nlogn) O(nlogn) 的复杂度求出 f ∗ g f∗g fg 的前 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) fg(n)=dnf(d)g(dn)=dng(d)f(dn)=gf(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) fgh(n)=dnf(d)tdng(t)h(dtn)=d1d2d3=nf(d1)g(d2)h(d3)=f(gh)(n)

分配律: f ∗ ( g + h ) = f ∗ g + f ∗ h f * (g + h) = f * g + f * h f(g+h)=fg+fh

单位元: f ∗ ε = f f*\varepsilon=f fε=f

重要性质: 若函数 f , g f,g f,g为积性函数,则 f ∗ g f*g fg也为积性函数( * 为狄利克雷特卷积)


0x33.1 常见积性函数的卷积

性质0x33.1: ∀ f ( n ) , e ∗ f ( n ) = f ( n ) \forall f(n),e*f(n)=f(n) f(n),ef(n)=f(n)

性质0x33.2: 1 ∗ 1 ( n ) = ∑ d ∣ n 1 = d ( n ) 1*1(n)=\sum_{d|n}1=d(n) 11(n)=dn1=d(n)

性质0x33.3: i d ∗ 1 ( n ) = ∑ d ∣ n d = σ ( n ) id*1(n)=\sum_{d|n}d=\sigma(n) id1(n)=dnd=σ(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)=dnμ(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=p1k1p2k2pmkm

代入上式得:
μ ∗ 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 ( 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)=dnμ(d)×1(dn)=C1=0k1C2=0k2Cm=0kmμ(p1C1p2C2pmCm)

我们分析该和式的实际意义,显然当某个质因子数量 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 ) = 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=01C2=01Cm=01μ(p1C1p2C2pmcm)=C1=01C2=01Cm=01(1)i=1mCi=i=0m(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)=dnφ(d)=n=id(n)

性质0x33.5证明:
∵ φ = μ ∗ i d , ϵ = μ ∗ 1 ∴ 1 ∗ φ = 1 ∗ μ ∗ i d ∴ 1 ∗ φ = ϵ ∗ i d = i d ( n ) ∴ ∑ d ∣ n φ ( d ) = n

φ = μ i d , ϵ = μ 1 1 φ = 1 μ i d 1 φ = ϵ i d = i d ( n ) d | n φ ( d ) = n
φ=μid,ϵ=μ11φ=1μid1φ=ϵid=id(n)dnφ(d)=n

积性函数的转换关系:

μ ⇒ ∗ 1 ⇒ ε ⇒ ∗ 1 ⇒ 1 ⇒ ∗ 1 ⇒ d \mu \Rightarrow^{*1}\Rightarrow \varepsilon\Rightarrow^{*1}\Rightarrow 1 \Rightarrow^{*1}\Rightarrow d μ1ε111d

φ ⇒ ∗ 1 ⇒ i d ⇒ ∗ 1 ⇒ σ \varphi\Rightarrow^{*1}\Rightarrow id\Rightarrow^{*1}\Rightarrow \sigma φ1id1σ

反方向的转换关系:

μ ⇐ ∗ μ ⇐ ε ⇐ ∗ μ ⇐ 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 fg 的前 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)=fg(n)=d  nf(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 mathHDU 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)=i1ii2i1i3i2ikik1f(ik)mod1000000007(1in)

Solution

显然题目中要求的式子就是 f ∗ 1 k f*1^k f1k,使用快速幂加速即可。

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场