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使用结论求此合数的欧拉值
            }
        }
    }
相关推荐
CoderCodingNo1 小时前
【NOIP】2011真题解析 luogu-P1003 铺地毯 | GESP三、四级以上可练习
算法
翊谦1 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
晓晓hh1 小时前
JavaSE学习——迭代器
java·开发语言·学习
iFlyCai1 小时前
C语言中的指针
c语言·数据结构·算法
Laurence1 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
查古穆1 小时前
栈-有效的括号
java·数据结构·算法
再一次等风来2 小时前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
汀、人工智能2 小时前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
大熊背2 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
kyriewen112 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5