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使用结论求此合数的欧拉值
            }
        }
    }
相关推荐
小王师傅662 小时前
【轻松入门SpringBoot】actuator健康检查(上)
java·spring boot·后端
Larry_Yanan3 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
醒过来摸鱼3 小时前
Java classloader
java·开发语言·python
superman超哥3 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
专注于大数据技术栈3 小时前
java学习--StringBuilder
java·学习
loosenivy3 小时前
企业银行账户归属地查询接口如何用Java调用
java·企业银行账户归属地·企业账户查询接口·企业银行账户查询
小鸡吃米…3 小时前
Python - 继承
开发语言·python
IT 行者3 小时前
Spring Security 6.x 迁移到 7.0 的完整步骤
java·spring·oauth2
JIngJaneIL3 小时前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
祁思妙想3 小时前
Python中的FastAPI框架的设计特点和性能优势
开发语言·python·fastapi