《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)

Posted 繁凡さん

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)相关的知识,希望对你有一定的参考价值。

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无任何商业用途。因个人实力时间等原因,本文并非完全原创,请大家见谅。

目录

《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)

《算法竞赛中的初等数论》(信奥 / 数竞 / ACM)前言、后记、目录索引(十五万字符的数论书)

全文目录索引链接: https://fanfansann.blog.csdn.net/article/details/113765056


0x50 筛法

0x51 线性筛法

在上面筛质数的时候,我们讲解了如何使用线性筛线性地筛出 1 , ⋯   , n 1,\\cdots,n 1,,n 中的所有质数。

每次只用一个数用小于当前这个数最小质因子的质数去筛其他数,即保证每个合数 i × p j i\\times p_j i×pj 只都被自己的最小质因子 p j p_j pj 筛掉一遍,所以复杂度保证是 O ( n ) O(n) O(n) 的。

我们知道,凡是积性函数,均可由线性筛法来求解。

0x51.1 线性筛法求欧拉函数

我们注意到在线性筛中,每一个合数都是被最小的质因子筛掉,筛法求素数的同时也得到了每个数的最小质因子,这是线性筛求欧拉函数的关键。

1. 考虑 n = p j k n=p_j^k n=pjk φ ( n ) \\varphi(n) φ(n)

显然有 φ ( p j k ) = p j k − p j k − 1 = p j k − 1 × ( p j − 1 ) \\varphi(p_j^k)=p_j^k-p_j^k-1=p_j^k-1\\times(p_j-1) φ(pjk)=pjkpjk1=pjk1×(pj1)

2. 考虑 n = i × p j n=i\\times p_j n=i×pj φ ( n ) \\varphi(n) φ(n) p j ∣ i p_j\\mid i pji

i i i 含有因子 p j p_j pj,由于 i = n p j i=\\fracnp_j i=pjn i i i 拥有 n n n 的所有质因子,由唯一分解定理及欧拉函数计算式得:

φ ( n ) = n × ∏ i = 1 s p i − 1 p i = p 1 × n ′ × ∏ i = 1 s p i − 1 p i = p 1 × φ ( n ′ ) \\beginaligned \\varphi(n) & = n \\times \\prod_i = 1^s\\fracp_i - 1p_i & \\\\ &= p_1 \\times n' \\times \\prod_i = 1^s\\fracp_i - 1p_i & \\\\ &= p_1 \\times \\varphi(n') \\endaligned φ(n)=n×i=1spipi1=p1×n×i=1spipi1=p1×φ(n)
3. 考虑 n = i × p j n=i\\times p_j n=i×pj φ ( n ) \\varphi(n) φ(n) p j ∤ i p_j\\nmid i pji

i i i p j p_j pj 互质,积性函数显然有性质:

φ ( n ) = φ ( i ) × φ ( p j ) = φ ( i ) × ( p j − 1 ) \\beginaligned \\varphi(n) & = \\varphi(i) \\times \\varphi(p_j) & \\\\ & = \\varphi(i) \\times (p_j - 1) \\endaligned φ(n)=φ(i)×φ(pj)=φ(i)×(pj1)

由于我们仅在在线性筛的框架上增加了一些细节,所以时间复杂度依然是 O ( n ) O(n) O(n) 的。

Code

void get_euler(int n)

    phi[1] = 1;
    for(int i = 2; i <= n; ++ i) 
        if(!vis[i]) 
            primes[ ++ cnt] = i;
            phi[i] = i - 1;
        
        for(int j = 1; j <= cnt && i * primes[j] <= n; ++ j) 
            vis[i * primes[j]] = true;
            if(i % primes[j] == 0) //最小的质因子
                phi[i * primes[j]] = phi[i] * primes[j];
                break;
            
            phi[i * primes[j]] = phi[i] * (primes[j] - 1);
        
    

0x51.2 线性筛求莫比乌斯函数

同样考虑三种情况即可。

1. 考虑 n = p j k n=p_j^k n=pjk μ ( n ) \\mu (n) μ(n)

显然有

μ ( p j ) = − 1 \\mu(p_j)=-1 μ(pj)=1

μ ( p j k ) = 0 , k > 1 \\mu(p_j^k)=0,k>1 μ(pjk)=0,k>1

2. 考虑 n = i × p j n=i\\times p_j n=i×pj μ ( n ) \\mu(n) μ(n)<

以上是关于《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛中的初等数论》正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)

《算法竞赛中的初等数论》正文 0x60 原根(ACM / OI / MO)(二十万字符数论书)

《算法竞赛中的初等数论》正文 0x00整除0x10 整除相关(ACM / OI / MO)(十五万字符数论书)

我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)

我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)

我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)