【算法基础:数学知识】4.3 欧拉函数

news2024/11/23 4:43:37

文章目录

  • 欧拉函数
    • 定义
    • 性质
  • 例题列表
    • 873. 欧拉函数(使用质因数分解求一个数的欧拉函数)
      • 原理讲解(公式推导)⭐
      • 解法代码
    • 874. 筛法求欧拉函数(求 1 ~ n 中所有数字的欧拉函数)⭐

欧拉函数

https://oi-wiki.org/math/number-theory/euler/

定义

在这里插入图片描述
1 ~ n 中和 n 互质的数字个数

Q:怎么判断两个数是互质的?
A:两个数的 最大公约数为1。(比如 1 和 1 就是互质的)

性质

在这里插入图片描述

φ ( n ) \varphi(n) φ(n)
在这里插入图片描述
即 先完成质因数分解,然后按公式计算。

例题列表

873. 欧拉函数(使用质因数分解求一个数的欧拉函数)

https://www.acwing.com/activity/content/problem/content/942/

在这里插入图片描述

原理讲解(公式推导)⭐

使用 容斥原理 计算出 ——
在这里插入图片描述

1 ~ N 中所有质数的个数是:

在这里插入图片描述
化简之后就是公式了。

在这里插入图片描述

解法代码

记住公式,
使用质因数分解求出 n 的所有的质因子。
使用所有质因子按照公式计算 n 的欧拉函数。(题目中也给出了公式)

import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while (n-- != 0) {
            System.out.println(euler(sc.nextInt()));
        }
    }

    static long euler(int n) {
        long res = n;
        for (int i = 2; i <= n / i; ++i) {
            if (n % i == 0) {
                while (n % i == 0) n /= i;
                res = res * (i - 1) / i;
            }
        }
        if (n > 1) res = res * (n - 1) / n;
        return res;
    }
}

874. 筛法求欧拉函数(求 1 ~ n 中所有数字的欧拉函数)⭐

https://www.acwing.com/activity/content/problem/content/943/

在这里插入图片描述

在欧氏筛质数的过程中计算欧拉函数。

使用到的一些欧拉函数的性质:

  1. 质数 x x x 的欧拉函数是 x − 1 x - 1 x1
  2. 对于 t = p [ j ] ∗ i t = p[j] * i t=p[j]i。当 i i % p[j] == 0 i 时,即 p [ j ] p[j] p[j] 也是 i i i 的质因子,则 t = i ∗ p [ j ] t = i * p[j] t=ip[j] 的质因子和 i i i 的质因子一样,因此 e u l e r [ t ] = p [ j ] ∗ e u l e r [ i ] euler[t] = p[j] * euler[i] euler[t]=p[j]euler[i]
  3. 对于 t = p [ j ] ∗ i t = p[j] * i t=p[j]i。当 i i % p[j] != 0 i 时,即 p [ j ] p[j] p[j] 不是 i i i 的质因子,则 t = i ∗ p [ j ] t = i * p[j] t=ip[j] 的质因子比 i i i 的质因子多了一个 p [ j ] p[j] p[j],因此 e u l e r [ t ] = p [ j ] ∗ e u l e r [ i ] ∗ ( 1 − 1 / p [ j ] ) = ( p [ j ] − 1 ) ∗ e u l e r [ i ] euler[t] = p[j] * euler[i] * (1 - 1 / p[j]) = (p[j] - 1) * euler[i] euler[t]=p[j]euler[i](11/p[j])=(p[j]1)euler[i]
import java.util.*;

public class Main {
    final static int N = 1000001;
    static int cnt = 0;
    static int[] primes = new int[N], euler = new int[N];
    static boolean[] st = new boolean[N];       // 是否被筛掉了

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        euler[1] = 1;                           // 初始化欧拉数组
        // 欧氏筛质数
        for (int i = 2; i <= n; ++i) {
            if (!st[i]) {                       // 如果 i 没有被筛掉,是质数
                primes[cnt++] = i;
                euler[i] = i - 1;               // 质数的 x 的欧拉函数是 x - 1 (去掉它本身)
            }
            // 筛掉所有 primes[j] 的 i 倍
            for (int j = 0; primes[j] <= n / i; ++j) {
                int t = primes[j] * i;
                st[t] =true;
                if (i % primes[j] == 0) {
                    euler[t] = euler[i] * primes[j];	// t和i的质因子一样
                    break;
                }
                euler[t] = euler[i] * (primes[j] - 1);	// t的质因子比i多了一个p[j]
            }
        }

        long ans = 0;                           // 答案会超 int,所以使用 long
        for (int i = 1; i <= n; ++i) {
            ans += euler[i];
        }
        System.out.println(ans);
    }
}

在 欧式筛的过程中,利用上面提到的一些性质来筛出 1 ~ n 的所有欧拉函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装及配置zabbix_agent代理端(监控FTP服务器)

监控agent的linux主机我们在之前的文章里已经做好了 现在直接安装ftp服务即可 [rootagent ~]# yum install -y vsftpd[rootagent ~]# systemctl start vsftpd #启动ftp服务[rootagent ~]# systemctl enable vsftpd #设置ftp服务开机自启 Created symlink fro…

codec2play流程总结

Codec2.0(C2)是android系统为vendor提供的用于实现video/audio/filter模块的的HAL层接口API&#xff0c;vendor可用这个API实现他们自己的HAL层&#xff0c;Codec2.0是用于替换现有的OMX-IL。 数据流程 C2LinearBlock创建share ptr类型block&#xff0c;fetchLinearBlock对blo…

【每日一题Day274】LC42接雨水 | 单调栈

接雨水【LC42】[面试常见] 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 按列求贡献&#xff1a;枚举 首先确定按行计算雨水&#xff0c;还是按列确定雨水 按行计算&#xff1a; 按列计算&#xff1…

SpringBoot之jackson之复杂XML和Object互转、泛型、传参/接参

引入依赖 <!-- lombok插件 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- jackson xml 转换工具 --><dependency><…

自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用&#xff0c;项目的目标是通过训练一个GRU模型…

crmeb部署

安装宝塔 教程 安装所需要的软件 php mysql5.7 redis fileinfo nginx 安装crmeb 重启mysql 前台http://192.168.216.128/ 后台http://192.168.216.128/admin admin admin888登录 访问前台

GOF 代理模式

1.需求 &#xff08;1&#xff09;&#xff1a;在程序中&#xff0c;对象A和对象B无法直接交互时。 &#xff08;2&#xff09;&#xff1a;在程序中&#xff0c;功能需要增强时。 &#xff08;3&#xff09;&#xff1a;在程序中&#xff0c;目标需要被保护时 代理模式中有一…

使用html和css技巧提升网站加载速度

使用html和css技巧提升网站加载速度 加载时间每增加一秒&#xff08;0-5 秒之间&#xff09;&#xff0c;网站转化率平均就会下降 4.42%。页面加载时间的前五秒对转化率的影响最大。 通过更改html和css文件可以提高网站的页面加载速度,本文现在就来介绍一下怎么实现。 延迟加载…

51单片机--AT24C02数据存储

文章目录 存储器的介绍AT24C02I2C总线I2C时序结构AT24C02数据帧AT24C02数据存储实例 存储器的介绍 存储器是计算机系统中的一种重要设备&#xff0c;用于存储程序和数据&#xff0c;它可以通过电子、磁性介质等技术来记录和保持数据。在这里&#xff0c;主要介绍的是随机存储器…

Java SPI机制:扩展Java应用的灵活性与可插拔性

文章目录 引言1. Java SPI机制简介2. Java SPI的工作原理2.1. 定义服务接口2.2. 编写服务提供者2.3. 创建SPI配置文件2.4. 使用Service Loader加载服务2.5. 客户端代码调用服务 3. 实例演示HelloEnService .javaHelloZhServiceImpl .javaMETA-INF/services/com.gpj.spi.HelloSe…

Blazor前后端框架Known-V1.2.6

V1.2.6 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

kubesphere安装中间件

kubesphere安装mysql 创建configMap [client] default-character-setutf8mb4[mysql] default-character-setutf8mb4[mysqld] init_connectSET collation_connection utf8mb4_unicode_ci init_connectSET NAMES utf8mb4 character-set-serverutf8mb4 collation-serverutf8mb4_…

Nuxt 菜鸟入门学习笔记一:介绍与安装

文章目录 介绍 Introduction自动化和惯例服务器端渲染服务器引擎生产就绪模块化架构 安装 Installation准备安装 Nuxt官网地址&#xff1a; https://nuxt.com/ 介绍 Introduction Nuxt 是一个免费的开源框架&#xff0c;以直观和可扩展的方式使用 Vue.js 创建类型安全、高性能…

SQL篇-04_SQL进阶挑战-02_ 表与索引操作

SQL118 创建一张新表 描述 现有一张用户信息表&#xff0c;其中包含多年来在平台注册过的用户信息&#xff0c;随着牛客平台的不断壮大&#xff0c;用户量飞速增长&#xff0c;为了高效地为高活跃用户提供服务&#xff0c;现需要将部分用户拆分出一张新表。 原来的用户信息表&…

【指针和数组笔试题(1)】详解指针、数组笔试题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言整型数组字符数组第一组题第二组题第三组题 总结 前言 在计算之前要了解基本概念&#xff1a; 数组名的理解 数组名是数组首元素的地址 有两个例外 1.sizeof(…

小白到运维工程师自学之路 第五十八集 (zabbix监控数据库)

一、为server.Zabbix.com添加服务模板 二、配置数据库 cd /usr/local/zabbix/etc/ vim zabbix_agentd.conf 添加配置项 UnsafeUserParameters1 //允许所有字符的参数传递给用户定义的参数。 UserParametermysql.version,mysql -V //定义键值mysql.version&a…

Windows11的VTK安装:VS201x+Qt5/Qt6 +VTK7.1/VTK9.2.6

需要提前安装好VS2017和VS2019和Qt VS开发控件以及Qt VS-addin。 注意Qt6.2.4只能跟VTK9.2.6联合编译&#xff08;目前VTK9和Qt6的相互支持版本&#xff09;。 首先下载VTK&#xff0c;需要下载源码和data&#xff1a; Download | VTKhttps://vtk.org/download/ 然后这两个文…

word图自动编号引用

一.引用&#xff0c;插入题注&#xff0c;新建标签&#xff0c;图1-&#xff0c;这样生成的就是图1-1这种&#xff0c;确定 再添加图片就点击添加题注就行&#xff0c;自动生成图1-2这种 二.图例保存为书签 插入&#xff0c;书签&#xff0c;书签命名&#xff0c;如图1 三…

hashCode() 相关问题

# hashCode() 有什么用&#xff1f; hashCode() 的作用是获取哈希码&#xff08;int 整数&#xff09;&#xff0c;也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。 hashCode() 方法 hashCode() 定义在 JDK 的 Object 类中&#xff0c;这就意味着 Java 中…