首页 > 其他分享 >欧拉函数的实现

欧拉函数的实现

时间:2023-01-01 14:35:28浏览次数:60  
标签:函数 实现 res int maxn 线性 欧拉

目录

欧拉函数的定义

对于正整数 \(n\),欧拉函数 \(\varphi(n)\) 是小于等于 \(n\) 的正整数中与 \(n\) 互质的数的个数。

若有标准分解 \(n = p_1^{k_1} p_2^{k_2} \cdots p_r^{k_r}\)(其中 \(p_i\) 为互异的质因子,各 \(k_i \ge 1\) 为质因子的次数),则欧拉函数在该处的值为

\[\varphi(n) = p_1^{k_1-1} p_2^{k_2-1} \cdots p_r^{k_r-1} (p_1-1) (p_2-1) \cdots (p_r-1) \]

亦可等价写成

\[\varphi(n) = n (1 - \frac{1}{p_1}) (1 - \frac{1}{p_2}) \cdots (1 - \frac{1}{p_r}) \]

\[\varphi(n) = n \prod_{i=1}^r (1 - \frac{1}{p_i}) \]

对应的 C++ 实现代码如下:

int phi(int n) {
    int res = n;
    for (int i = 2; i*i <= n; 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;
}

欧拉函数的一般解法(试除法)

《例题1.欧拉函数基础1》:https://www.luogu.com.cn/problem/U271793

示例程序:

#include <bits/stdc++.h>
using namespace std;

int phi(int n) {
    int res = n;
    for (int i = 2; i*i <= n; 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;
}

int main() {
    int t, n;
    cin >> t;
    while (t--) {
        cin >> n;
        cout << phi(n) << endl;
    }
    return 0;
}

线性筛

线性筛的主要思想我觉得就是一句话:

对于一个合数,使用它最小的质因子去过滤掉它(这里,过滤的意思就是排除它是质数的可能)。

《P3383 线性筛素数》:https://www.luogu.com.cn/problem/P3383

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxp = 1e8 + 5, maxn = 6e6 + 5;
bool isp[maxp];
int prime[maxn], cnt;

void init(int n) {
    for (int i = 2; i <= n; i++) {
        if (!isp[i])
            prime[cnt++] = i;
        for (int j = 0; j < cnt && i * prime[j] <= n; j++) {
            isp[i * prime[j]] = true;
            if (i % prime[j] == 0)
                break;
        }
    }
}

int n, q, k;

int main() {
    scanf("%d%d", &n, &q);
    init(n);
    while (q--) {
        scanf("%d", &k);
        printf("%d\n", prime[k-1]);
    }
    return 0;
}

欧拉函数的线性筛法

《例题2.欧拉函数基础2》:https://www.luogu.com.cn/problem/U271924

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e7 + 5;

bool isp[maxn];
int phi[maxn], prime[maxn], cnt;

void init(int n) {
    phi[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (!isp[i]) {
            prime[cnt++] = i;
            phi[i] = i-1;
        }
        for (int j = 0; j < cnt && i * prime[j] <= n; j++) {
            isp[i * prime[j]] = true;
            if (i % prime[j] == 0) {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
}

int main() {
    init(maxn-1);
    int t, n;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        printf("%d\n", phi[n]);
    }
    return 0;
}

参考资料

标签:函数,实现,res,int,maxn,线性,欧拉
From: https://www.cnblogs.com/quanjun/p/17018048.html

相关文章

  • OpenCV+yolov3实现目标检测(C++,Python)
    OpenCV+yolov3实现目标检测(C++,Python)  目标检测算法主要分为两类:一类是基于RegionProposal(候选区域)的算法,如R-CNN系算法(R-CNN,FastR-CNN,FasterR-CNN),它们是two-st......
  • C++用finally函数实现当前函数运行结束自动执行一段代码
    我们的需求可能有这样的需求,fun(){    xx;    xx;    xx;    //希望在这里能自动执行一段设定好的代码,实现一些自动清除啥啥啥的操作}核心......
  • 聊一聊计算机视觉中常用的注意力机制 附Pytorch代码实现
    聊一聊计算机视觉中常用的注意力机制以及Pytorch代码实现注意力机制(Attention)是深度学习中常用的tricks,可以在模型原有的基础上直接插入,进一步增强你模型的性能。注意力机制......
  • GitChat活动:MyBatis 通用 Mapper 实现原理及相关内容
    MyBatis通用Mapper是一个可以让开发人员更方便使用MyBatis的扩展,通过简单的配置,可以方便的直接获取单表的常见操作,提供如select,selectAll,selectCount,delete,up......
  • 函数入门
    函数的作用:函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。定义一个函数函数代码块以def关键词开头,后接函数标识符名称和圆括号()。任何传入参数......
  • 常用数据分析方法:方差分析及实现!
     Datawhale干货 作者:吴忠强,Datawhale优秀学习者,东北大学一个复杂的事物,其中往往有许多因素互相制约又互相依存。方差分析是一种常用的数据分析方法,其目的是通过数据分析......
  • P2398 GCD SUM——欧拉函数
    此题可以拓展为\(\sum\limits^n_{i=1}\sum\limits^m_{j=1}\gcd(i,j)\)结论是\(\sum\limits^{\min(n,m)}_{d=1}\varphi(d)\lfloor\dfrac{n}{d}\rfloor\lfloor\dfrac{m}{......
  • Linux 或 Windows 安装 Kafka,示例实现生产与消费消息(一)
    下载:wgethttps://downloads.apache.org/kafka/3.3.1/kafka_2.12-3.3.1.tgz  注意:kafka正常运行,必须配置zookeeper,kafka安装包已经包括zookeeper服务解压:tar-zxvf k......
  • 欧拉如何计算 $\zeta(2)$ aka 巴塞尔问题
    欧拉如何计算\(\zeta(2)\)新年特别篇,祝大家新年快乐,新的一年和欧拉一样智慧。问题引入我们知道,Riemannzeta函数\(\zeta(s)\)的定义为\[\zeta(s)=\sum_{k\ge1}k^{-s......
  • Laravel8配置Vue且实现SPA
    Laravel8和Vue安装创建新的Laravel8项目//使用composer安装composercreate-project--prefer-distlaravel/laravel"项目名称"//如果有Laravel安装器laravelnew"......