欧拉函数与欧拉定理

文章目录

  • AcWing 873. 欧拉函数
    • 题目链接
    • 欧拉函数
    • 欧拉函数的证明
    • 思路
    • CODE
    • 时间复杂度分析
  • AcWing 874. 筛法求欧拉函数
    • 题目链接
    • 问题分析与时间复杂度
    • CODE
    • 思路
  • 欧拉定理



AcWing 873. 欧拉函数

题目链接

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


欧拉函数

对于正整数 n n n,欧拉函数是小于或等于 n n n 的正整数中与 n n n 互质的数的数目,记作 φ ( n ) φ(n) φ(n)
φ ( 1 ) = 1 φ(1)=1 φ(1)=1


欧拉函数的证明

基于容斥原理

所以归纳得到公式: K = N ( 1 − 1 / p 1 ) ( 1 − 1 / p 2 ) . . . ( 1 − 1 / p i ) K = N(1 - 1/p1)(1 - 1/p2)...(1 - 1/pi) K=N(11/p1)(11/p2)...(11/pi)


思路

按照分解质因数的逻辑挨个得到质因数,然后累乘即可。


CODE

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int phi(int x){
    int res = x;
    
    for(int i = 2; i <= x / i; ++i){
        if(x % i == 0){
            res = res / i * (i - 1);
            
            while(x % i == 0) x /= i;
        }
    }
    
    if(x > 1) res = res / x * (x - 1);
    
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    
    while (n -- ){
        int a;
        scanf("%d", &a);
        
        cout << phi(a) << endl;
    }
}

时间复杂度分析

复杂度瓶颈在于分解质因数,所以是 O ( n ) O(\sqrt{n}) O(n )



AcWing 874. 筛法求欧拉函数

题目链接

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

问题分析与时间复杂度

对于范围内的每个数都求欧拉函数,肯定不能用定义法一个一个求,这样时间复杂度为 O ( n ⋅ n ) O(n·\sqrt n) O(nn ),我们可以用线性筛筛出质数再计算质因数,时间复杂度为 O ( n ) O(n) O(n)


CODE

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e6 + 10;
int primes[N], eulers[N], cnt;
bool st[N];

void get_eulers(int n){
    eulers[1] = 1;
    
    for(int i = 2; i <= n; ++i){
        if(!st[i]){
            primes[cnt++] = i;
            eulers[i] = i - 1;
        }
        
        for(int j = 0; primes[j] <= n / i; ++j){
            int t = primes[j] * i;
            st[t] = true;
            
            if(i % primes[j] == 0){
                eulers[t] = eulers[i] * primes[j];
                break;
            }
            
            eulers[t] = eulers[i] * (primes[j] - 1);
        }
    }
}

int main(){
    int n;
    scanf("%d", &n);
    
    get_eulers(n);
    
    long long res = 0;
    for(int i = 1; i <= n; ++i) res += eulers[i];
    
    cout << res << endl;
}

思路

主要有三点:

  • 如果 i 是质数:那么[1, i - 1]都是i的质因数,所以有
    eulers[i] = i - 1;
    
  • 如果 i 不是质数:那么它会被筛掉,这里有两种情况:
    • primes[j]i的最小质因子时:
      • i * primes[j]的欧拉函数是这样的: K = i ∗ p r i m e s [ j ] ∗ ( 1 − 1 / p 1 ) . . . ( 1 − 1 / p i ) K = i * primes[j] * (1 - 1/p1)...(1 - 1/pi) K=iprimes[j](11/p1)...(11/pi)我们会发现整个式子化简得到: K = e u l e r s [ i ] ∗ p r i m e s [ j ] K = eulers[i] * primes[j] K=eulers[i]primes[j]也就是说是i的欧拉函数乘上了最小质因子primes[j]的值。
    • primes[j]不是i的最小质因子时:
      • i * primes[j]的欧拉函数是这样的: K = i ∗ p r i m e s [ j ] ∗ ( 1 − 1 / p 1 ) . . . ( 1 − 1 / p i ) ( 1 − 1 / p r i m e s [ j ] ) K = i * primes[j] * (1 - 1/p1)...(1 - 1/pi)(1 - 1/primes[j]) K=iprimes[j](11/p1)...(11/pi)(11/primes[j])虽然primes[j]不是i的最小质因子,但是是primes[j] * i的最小质因子,所以需要多乘上 1 − 1 / p r i m e s [ j ] 1 - 1/primes[j] 11/primes[j]。化简得: K = e u l e r s [ i ] ∗ ( p r i m e s [ j ] − 1 ) K = eulers[i] * (primes[j] - 1) K=eulers[i](primes[j]1)


欧拉定理

a a a n n n 互质,则 a φ ( n ) ≡ 1 ( m o d   n ) a^{φ(n)} ≡ 1(mod\ n) aφ(n)1(mod n)

证明:
1 1 1 ~ n n n 中,设 n n n 的欧拉函数为 a 1 , a 2 , . . .   , a φ ( n ) a_1, a_2, ...\ , a_{φ(n)} a1,a2,... ,aφ(n),那么全部乘上 a a a 得到 a a 1 , a a 2 , . . .   , a a φ ( n ) aa_1, aa_2, ...\ ,aa_{φ(n)} aa1,aa2,... ,aaφ(n),那么得到如下式子: a φ ( n ) ( a 1 , . . .   , a i ) ≡ ( a 1 , . . .   , a i )    ( m o d   n ) a^{φ(n)}(a_1, ...\ , ai) ≡ (a1, ...\ ,ai)\ \ (mod\ n) aφ(n)(a1,... ,ai)(a1,... ,ai)  (mod n)两边消去得到欧拉定理: a φ ( n ) ≡ 1 ( m o d   n ) a^{φ(n)} ≡ 1(mod\ n) aφ(n)1(mod n)

n , a n, a n,a 互质时,可以得到费马定理: a n − 1 ≡ 1 ( m o d   n ) a^{n - 1} ≡ 1(mod\ n) an11(mod n)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四六级高频词组7

目录 词组 其他文章链接&#xff1a; 词组 251. &#xff08;be&#xff09; equivalent to&#xff08;equal in value&#xff0c; amount&#xff0c; meaning&#xff09; 相等于&#xff0c; 相当于 252. in essence &#xff08;in itsones nature&#xff09; 本质上…

20、备忘录模式(Memento Pattern,不常用)

备忘录模式又叫作快照模式&#xff0c;该模式将当前对象的内部状态保存到备忘录中&#xff0c;以便在需要时能将该对象的状态恢复到原先保存的状态。 备忘录模式提供了一种保存和恢复状态的机制&#xff0c;常用于快照的记录和状态的存储&#xff0c;在系统发生故障或数据发生…

网络安全项目实战(三)--报文检测

6. TCP/IP协议栈及以太网帧 目标 了解TCP/IP协议栈的组织结构掌握以太网帧的数据格式定义能应用编码实现以太网帧的解析方法 6.1. TCP/IP 协议栈 TCP/IP网络协议栈分为应用层&#xff08;Application&#xff09;、传输层&#xff08;Transport&#xff09;、网络层&#xf…

【UML】第4篇 UML公共机制(补扩展机制)

目录 一、扩展机制 1.1 构造型 1.2 标记值&#xff08;Tagged Value&#xff09; 1.3 约束&#xff08;Constraint&#xff09; 上节扩展机制没有讲完&#xff0c;如上图。 一、扩展机制 1.1 构造型 UML中的扩展机制包括约束、构造型和标记值&#xff0c;其中的构造型定义…

yo!这里是Linux信号相关介绍

目录​​​​​​​ 前言 基本介绍 概念 信号列表 信号处理 产生(发送)信号 通过按键产生 系统函数产生 软件条件产生 硬件异常产生 阻塞信号 信号状态 sigset_t 状态相关函数 1.sigprocmask 2.sigpending 捕捉信号 内核态与用户态 捕捉过程 sigaction 后…

分库分表及ShardingShpere-proxy数据分片

为什么需要分库&#xff1f; 随着数据量的急速上升&#xff0c;单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈&#xff0c;所以需要考虑拆分数据库&#xff0c;将数据库分布在不同实例上提升数据库可用性。主要的原因有如下&#xff1a; 磁盘存储。业务量剧增&…

nodejs项目设置全局变量(global)

文章目录 前言一、使用global二、解决type typeof globalThis has no index signature.ts问题1、新建 /types/global.d.ts文件2、或者直接在入口文件/src/index.ts定义 三、最终效果鼠标放在global上&#xff0c;可显示global的类型生效了~ ![在这里插入图片描述](https://img-…

I.MX RT1170双核学习(2):双核相互激活和启动流程

RT1170这个芯片带有双核&#xff1a;Cortex-M7和Corterx-M4&#xff0c;两个核都可以独立地运行&#xff0c;当然双核也可以同时运行。在上一篇文章中&#xff0c;介绍了一下在RT1170中消息模块MU的使用&#xff1a;双核通信之MU消息单元详解&#xff0c;因为这是双核之间用来通…

05 python数据容器

5.1 数据容器认识 5.2 python列表 5.2.1 列表的定义 演示数据容器之&#xff1a;list 语法&#xff1a;[元素&#xff0c;元素&#xff0c;....] #定义一个列表List List [itheima,uityu,gsdfg] List1 [itheima,6666,True] print(List) print(List1) print(type(List)) pr…

smartKettle离线部署及问题记录

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 部署&#x1f4d7;源码下载&#x1f4d7;后端部署&#x1f4d5;导入后端项目&#x1f4d5;修改settings.xml(自动下载相关jar包)&#x1f4d5; 编译&#x1f4d5; …

0x13 链表与邻接表

0x13 链表与邻接表 数组是一种支持随机访问&#xff0c;但不支持在任意位置插入和删除元素的数据结构。与之相对应&#xff0c;链表支持在任意位置插入或删除元素&#xff0c;但只能按顺序依次访问其中元素。我们可以使用一个struct来表示链表的节点&#xff0c;其中可以存储任…

MySQL线上死锁案例分析

项目场景 项目开发中有两张表&#xff1a;c_bill(账单表)&#xff0c;c_bill_detail(账单明细表)&#xff0c;他们的表结构如下&#xff08;这里只保留必要信息&#xff09;&#xff1a; CREATE TABLE c_bill_detail (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主…

Gin之GORM 查询语句

前期工作可以看之前的&#xff08;连接数据库&#xff1b;以及确定要操作的库&#xff09; Gin之GORM 操作数据库&#xff08;MySQL&#xff09;-CSDN博客https://blog.csdn.net/m0_72264240/article/details/134948202?spm1001.2014.3001.5502这次我们操作gin库下的另外一个…

Lenovo联想拯救者Legion Y9000X 2021款(82BD)原装出厂Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1GRTR7CAAQJdnh4tHbhQaDQ?pwdl42u 提取码&#xff1a;l42u 联想原厂WIN10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&am…

记录汇川:套接字TCP通信-梯形图

H5U集成一路以太网接口。使用AutoShop可以通过以太网方便、快捷对H5U进行行监控、下载、上载以及调试等操作。同时也可以通过以太网与网络中的其他设备进行数据交互。H5U集成了Modbus-TCP协议&#xff0c;包括服务器与客户端。可轻松实现与支持Modbus-TCP的设备进行通讯与数据交…

Redis哨兵模式:什么是哨兵模式、哨兵模式的优缺点、哨兵模式的主观下线和客观下线、投票选举、Redis 哨兵模式搭建

文章目录 什么是哨兵模式哨兵模式的优缺点主观下线和客观下线投票选举哨兵模式场景应用Redis version 6.0.5 集群搭建下载文件环境安装解压编译配置文件启动关闭密码设置 什么是哨兵模式 哨兵模式是Redis的高可用解决方案之一&#xff0c;它旨在提供自动故障转移和故障检测的功…

数据分析基础之《numpy(3)—基本操作》

一、基本操作 1、adarray.方法() 2、np.函数名() 二、生成数组的方法 1、生成0和1的数组 为什么需要生成0和1的数组&#xff1f; 我们需要占用位置&#xff0c;或者生成一个空的数组 &#xff08;1&#xff09;ones(shape[, dtype, order]) 生成一组1 shape&#xff1a;形…

STM32读取EEPROM存储芯片AT24C512故障然后排坑记录

背景&#xff1a; 有一个项目用到STM32F091芯片去读取 AT24C512C-SSHD EEPROM 芯片&#xff0c;我直接移植了之前项目的IIC库&#xff0c;结果程序运行后&#xff0c;读不出EEPROM里面的数据。 摘要&#xff1a; 本文主要介绍一个基于STM32F091芯片和AT24C512C-SSHD EEPROM芯片…

Java面向对象思想以及原理以及内存图解

文章目录 什么是面向对象面向对象和面向过程区别创建一个对象用什么运算符?面向对象实现伪代码面向对象三大特征类和对象的关系。 基础案例代码实现实例化创建car对象时car引用的内存图对象调用方法过程 成员变量和局部变量作用范围在内存中的位置 关于对象的引用关系简介相关…

6、生产者压缩算法面面观

生产者压缩算法面面观 1、怎么压缩&#xff1f;2、何时压缩&#xff1f;2.1、生产者端2.2、Broker 端 3、何时解压缩&#xff1f;4、各种压缩算法对比 压缩的思想&#xff0c;实际就是用时间去换空间的经典 trade-off 思想&#xff0c;在 Kafka 中&#xff0c;就是用 CPU 时间去…