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使用结论求此合数的欧拉值
            }
        }
    }
相关推荐
香蕉鼠片8 分钟前
算法过程中不会的
开发语言·c++
阿旭超级学得完16 分钟前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
輕華16 分钟前
uv工具详解——Python包与项目管理器完全指南
开发语言·python·uv
li星野18 分钟前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
jerryinwuhan21 分钟前
hello算法,简单讲(1)
算法·排序算法
y = xⁿ24 分钟前
20天速通LeetCodeday15:BFS广度优先搜索
算法·宽度优先
400分27 分钟前
吃透RAG核心-----语义检索与关键字检索底层原理
算法·架构
目黑live +wacyltd35 分钟前
算法备案:常见驳回原因与应对策略
人工智能·算法
念何架构之路38 分钟前
Go语言常见并发模式
开发语言·后端·golang