Acwing 基础算法课 数学知识 筛法求欧拉函数

【G09 筛法求欧拉函数】https://www.bilibili.com/video/BV1VP411p7Bs?vd_source=57dbd16b8c7c2ad258cccce5966c5be8

闫总真是把听者当数学系转cs的来讲,菜逼完全听不懂,只能其他地再搜


欧拉函数 φ ( n ) \varphi(n) φ(n):1~n中与n互质的数的个数

如: φ ( 6 ) = 2 \varphi(6) = 2 φ(6)=2

互质:两个数互质(也称为互素)是指它们的最大公约数(GCD)为1

试除法求欧拉函数

c 复制代码
int phi(int n){
    int res = n;
    // 试除法求欧拉函数
    for (int i = 2; i <= n/i;++i){
        if(n%i == 0){
            res = res/i*(i-1);
            while (n%i == 0) n/=i;
        }
    }
    if(n > 1) res = res/n*(n-1);
    return res;
}

筛法求欧拉函数

c 复制代码
// 线性筛求欧拉函数
const int N = 100010;
int p[N], vis[N], cnt; // p 质数表
int phi[N]; // phi 欧拉值

void get_phi(int n){
    phi[1] = 1;
    for (int i = 2; i <= n; i++){
        if (!vis[i]){
            // 素数
            p[cnt++] = i;
            phi[i] = i - 1;
        }
        // 利用当前数i去枚举合数
        for (int j = 0; i * p[j] <= n; j++){
            // 遍历质数表
            int m = i * p[j];
            vis[m] = 1;
            // 如果p[j]是i的最小质因子,则停止枚举构造合数。每个合数仅由最小质因子去枚举
            if (i % p[j] == 0){
                phi[m] = p[j] * phi[i]; // 使用结论求此合数的欧拉值
                break;
            }
            else{
                phi[m] = (p[j] - 1) * phi[i]; //c使用结论求此合数的欧拉值
            }
        }
    }
相关推荐
祁同伟.1 小时前
【C++】多态
开发语言·c++
普通网友1 小时前
IZT#73193
java·php·程序优化
rechol1 小时前
C++ 继承笔记
java·c++·笔记
朱嘉鼎2 小时前
C语言之可变参函数
c语言·开发语言
Han.miracle4 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
北冥湖畔的燕雀5 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
Le1Yu5 小时前
分布式事务以及Seata(XA、AT模式)
java
寒山李白6 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
mit6.8246 小时前
前后缀分解
算法
QX_hao6 小时前
【Go】--map和struct数据类型
开发语言·后端·golang