数据结构与算法学习笔记----欧拉函数

数据结构与算法学习笔记----欧拉函数

@@ author: 明月清了个风
@@ first publish time: 2025.1.1

ps⭐️欧拉函数的定义及求法,第二题是在线性筛法的过程中维护欧拉函数。

欧拉函数

通常用符号 φ ( n ) \varphi(n) φ(n)表示,定义为小于或等于 n n n且与 n n n互质的正整数的个数。

如何求解

n n n的质因数分解为(基于算术基本定理,这里可以看上一篇约数的相关内容):

n = p 1 e 1 p 2 e 2 ⋯ p k e k (1) n=p_{1}^{e_1}p_{2}^{e_2}\cdots p_{k}^{e_k} \tag{1} n=p1e1p2e2pkek(1)

则欧拉函数 φ ( n ) \varphi(n) φ(n)可以通过以下公式计算:

φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) (2) \varphi(n) = n (1 - \frac{1}{p_1}) (1 - \frac{1}{p_2}) \cdots (1 - \frac{1}{p_k}) \tag{2} φ(n)=n(1p11)(1p21)(1pk1)(2)

公式推导

这里给出y总讲解的公式推导,根据容斥原理进行理解。

对于每个质因数 p i p_i pi来说, 1 ∼ n 1 \sim n 1n中有 n p i \frac{n}{p_i} pin个数与 n n n不互斥,这些分别是 p i p_i pi 1 1 1倍, 2 2 2倍…。

那么就要从 n n n中减去这些数,因此有

n − n p 1 − n p 2 − ⋯ − n p k (3) n - \frac{n}{p_1} - \frac{n}{p_2} - \cdots -\frac{n}{p_k} \tag{3} np1np2npkn(3)

但是需要注意的是,在 1 ∼ n 1 \sim n 1n中也会有一些数既是 p i p_i pi的倍数又是 p j p_j pj的倍数,那么这个数就会被减去两次,因此又要加回来,上式变为

n − n p 1 − n p 2 − ⋯ − n p k + ∑ 1 p i p j (4) n - \frac{n}{p_1} - \frac{n}{p_2} - \cdots -\frac{n}{p_k} + \sum \frac{1}{p_i p_j} \tag{4} np1np2npkn+pipj1(4)

以此类推,又会有有的数是三个质因数的倍数,因此又会多加上,所以要再减去

最终就会有

n − n p 1 − n p 2 − ⋯ − n p k + ∑ 1 p i p j − ∑ 1 p i p j p k + ⋯ ± ∑ 1 p i p j ⋯ p k (5) n - \frac{n}{p_1} - \frac{n}{p_2} - \cdots -\frac{n}{p_k} + \sum \frac{1}{p_i p_j} - \sum \frac{1}{p_i p_j p_k} + \cdots \pm \sum \frac{1}{p_i p_j \cdots p_k} \tag{5} np1np2npkn+pipj1pipjpk1+±pipjpk1(5)

即式(2)的展开式。

Acwing 873. 欧拉函数

[原题链接](873. 欧拉函数 - AcWing题库)

给定 n n n个正整数 a i a_i ai,对于每个整数 a i a_i ai,请你求出每个数的欧拉函数。

输入格式

第一行包含整数 n n n

接下来 n n n行,每行包含一个正整数 a i a_i ai

输出格式

输出 n n n行,每行输出一个正整数 a i a_i ai的欧拉函数

数据范围

1 ≤ n ≤ 100 1 \le n \le 100 1n100,

1 ≤ a i ≤ 2 × 1 0 9 1 \le a_i \le 2\times 10^9 1ai2×109

思路

按照上述公式,对每个 a i a_i ai分解质因数即可,然后按式(2)乘起来,注意点是不要有小数,因此要变形一下,先除再乘,具体看代码的实现吧。

代码的时间复杂度瓶颈就在分解质因数这一步,因为要算 n n n次,所以为 O ( n n ) O(n\sqrt{n}) O(nn )

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;int main()
{int n;cin >> n;while(n --){int a;cin >> a;int res = a;for(int i = 2; i <= a / i; i ++){if(a % i == 0)  // 分解质因数{res = res / i * (i - 1);while(a % i == 0) a /= i;}}if(a > 1) res = res / a * (a - 1);cout << res << endl;}return 0;
}

Acwing 874. 筛法求欧拉函数

[原题链接](874. 筛法求欧拉函数 - AcWing题库)

给定一个正整数 n n n,求 1 ∼ n 1 \sim n 1n中每个数的欧拉函数之和。

输入格式

共一行,包含一个整数 n n n

输出格式

共一行,包含一个整数,表示 1 ∼ n 1 \sim n 1n中每个数的欧拉函数之和 。

数据范围

1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106

思路

线性筛选的过程中可以维护欧拉函数,关于线性筛法的讲解可以看这一个链接,这里我们放一个线性筛的代码

int primes[N], cnt;
bool st[N];void get_primes(int n)
{for(int i = 2; i <= n; i ++){if(!st[i]) primes[cnt ++] = i;for(int j = 0; primes[j] <= n / i; j ++){st[i * primes[j]] = true;if(i % primes[j] == 0) break;}}
}

首先根据定义,所有的质数 i i i的欧拉函数是 φ ( i ) = i − 1 \varphi(i) = i - 1 φ(i)=i1,因为 1 ∼ i 1 \sim i 1i中有 i − 1 i - 1 i1个数与质数 i i i自己互质。

在线性筛中,我们会将所有的质数都存在primes[]数组中,对于所有的合数通过st[]数组标记的方式筛选,那么对于这些数来说,有两种情况:1️⃣i %primes[j] != 0;2️⃣i % primes[[j] == 0

  • 线性筛的原则是对于每个非质数,用其最小质因子将其筛除,那么对于第一种情况,primes[j]不是i的质因子且大于i的所有质因子(因为是从小达到枚举的),那么对于数i * primes[j]来说,primes[j]就是其最小质因子,因此这里st[i * primes[j] = true将其筛除,那么其质因数分解就会是i的质因数分解再乘上primes[j],根据欧拉函数的定义,就可以知道其欧拉函数表达式为 φ ( i ∗ p r i m e s [ j ] ) = φ ( i ) ∗ p r i m e s [ j ] ∗ ( 1 − 1 p r i m e s [ j ] ) \varphi(i * primes[j]) = \varphi(i) * primes[j] * (1 - \frac{1}{primes[j]}) φ(iprimes[j])=φ(i)primes[j](1primes[j]1),用代码表示就是phi[i * primes[j] = phi[i] * (primes[j] - 1)
  • 那么对于第二种情况,当i % primes[j] == 0时表示primes[j]i的最小质因子,因此因此其欧拉函数表达式为 φ ( i ∗ p r i m e s [ j ] ) = φ ( i ) ∗ p r i m e s [ j ] \varphi(i * primes[j]) = \varphi(i) * primes[j] φ(iprimes[j])=φ(i)primes[j],用代码表示就是phi[i * primes[j] = phi[i] * primes[j]

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;typedef long long LL;const int N = 1000010;int n;
int phi[N];
int primes[N], cnt;
bool st[N];LL get_eulers(int n)
{phi[1] = 1;for(int i = 2; i <= n; i ++){if(!st[i]) primes[cnt ++] = i, phi[i] = i - 1;for(int j = 0; primes[j] <= n / i; j ++){st[i * primes[j]] = true;if(i % primes[j] == 0){phi[i * primes[j]] = phi[i] * primes[j];break;}phi[i * primes[j]] = phi[i] * (primes[j] - 1);}}LL res = 0;for(int i = 1; i <= n; i ++) res += phi[i];return res;
}int main()
{cin >> n;cout << get_eulers(n) << endl;return 0;
}

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

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

相关文章

软件测试之非功能测试设计

非功能测试设计 非功能:除了软件功能测试&#xff0c;其他都是非功能测试。 1.兼容 2.易用 3.性能(专项) 4.安全(专项) Web浏览器 兼容:Chrome浏览器、Edge浏览器、Firefox浏览器、Safari苹果浏览器 易用:参考竞品&#xff0c;主观感受为主 总结 1.非功能测试范围 兼容性、…

【Spring Boot】SpringBoot自动装配-Import

目录 一、前言二、 定义三、使用说明 3.1 创建项目 3.1.1 导入依赖3.1.2 创建User类 3.2 测试导入Bean 3.2.1 修改启动类 3.3 测试导入配置类 3.3.1 创建UserConfig类3.3.2 修改启动类 3.4 测试导入ImportSelector 3.4.1 创建UseImportSelector类3.4.2 修改启动类3.4.3 启动测试…

异步爬虫之aiohttp的使用

在上一篇博客我们介绍了异步爬虫的基本原理和 asyncio 的基本用法&#xff0c;并且在最后简单提及了使用aiohttp 实现网页爬取的过程。本篇博客我们介绍一下 aiohttp 的常见用法。 基本介绍 前面介绍的 asyncio模块&#xff0c;其内部实现了对 TCP、UDP、SSL协议的异步操作&a…

操作系统课后题总复习

目录 一、第一章 1.1填空题 1.2单项选择题 1.3多项选择题 1.4判断题 1.5名词解释 1.6简答题 二、第二章 2.1填空题 2.2单项选择题 2.3 多项选择题 2.4判断题 2.5名词解释 2.6简答题 三、第三章 3.1填空题 3.2单项选择题 3.3多项选择题 3.4判断题 3.5名词解…

《探寻真正开源的大模型:开启AI创新新纪元》

《探寻真正开源的大模型&#xff1a;开启AI创新新纪元》 一、开源大模型崛起&#xff1a;AI 发展的新曙光二、开源大模型的 “庐山真面目”三、明星开源大模型闪耀登场&#xff08;一&#xff09;LLaMA 3&#xff1a;实力强劲的开源先锋&#xff08;二&#xff09;Phi-3&#x…

Debian-linux运维-ssh配置(兼容Jenkins插件的ssh连接公钥类型)

系统版本&#xff1a;Debian 12.5、11.1 1 生成密钥对 可以用云服务商控制台生成的密钥对&#xff0c;也可以自己在客户端或者服务器上生成&#xff0c; 已经有密钥对就可以跳过这步 用户默认密钥文件路径为 ~/.ssh/id_rsa&#xff0c;可以在交互中指定路径&#xff0c;也可…

基于服务器部署的综合视频安防系统的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。国产化人工智能“…

小程序学习05——uniapp路由和菜单配置

目录 一、路由 二、如何管理页面及路由&#xff1f; 三、pages.json 页面路由 四、 tabBar 一、路由 路由&#xff1a;在前端&#xff0c;往往指代用不同地址请求不同页面&#xff0c;决定了用户如何在应用的不同页面之间导航。 菜单&#xff1a;对于每个路径&#xff08;…

【网络安全实验室】SQL注入实战详情

如果额头终将刻上皱纹&#xff0c;你只能做到&#xff0c;不让皱纹刻在你的心上 1.最简单的SQL注入 查看源代码&#xff0c;登录名为admin 最简单的SQL注入&#xff0c;登录名写入一个常规的注入语句&#xff1a; 密码随便填&#xff0c;验证码填正确的&#xff0c;点击登录…

使用 ThinkPHP 和 Vue.js 开发现代 Web 应用的指南

使用 ThinkPHP 和 Vue.js 开发现代 Web 应用的指南 在当今的 Web 开发中&#xff0c;前后端分离架构逐渐成为一种主流趋势。结合 ThinkPHP 和 Vue.js&#xff0c;可以高效地构建现代化的 Web 应用。本文将详细介绍如何使用这两种技术栈&#xff0c;从环境搭建到基本功能实现&a…

_使用CLion的Vcpkg安装SDL2,添加至CMakelists时报错,编译报错

语言&#xff1a;C20 编译器&#xff1a;gcc 14.2 摘要&#xff1a;初次使用Vcpkg添加SDL2&#xff0c;出现CMakelists找不到错误、编译缺失main错误、运行失败错误。 CMakelists缺失错误&#xff1a; 使用CLion的Vcpkg安装SDL2时&#xff0c;按照指示把对应代码添加至CMakel…

可解释性:走向透明与可信的人工智能

随着深度学习和机器学习技术的迅速发展&#xff0c;越来越多的行业和领域开始应用这些技术。然而&#xff0c;这些技术的“黑盒”特性也带来了不容忽视的挑战&#x1f3b2;。在许多任务中&#xff0c;尽管这些模型表现出色&#xff0c;取得了相当高的精度&#xff0c;但其决策过…

SQL Server导出和导入可选的数据库表和数据,以sql脚本形式

一、导出 1. 打开SQL Server Management Studio&#xff0c;在需要导出表的数据库上单击右键 → 任务 → 生成脚本 2. 在生成脚本的窗口中单击进入下一步 3. 如果只需要导出部分表&#xff0c;则选择第二项**“选择具体的数据库对象(Select specific database objects)”**&am…

uniapp——App下载文件,打开文档(一)

uniapp如何下载文件、打开文件 文章目录 uniapp如何下载文件、打开文件下载文件下载文件成功返回数据格式 打开文档处理 iOS 打开文件可能失败问题 相关API&#xff1a; uni.downloadFileuni.openDocument 注意&#xff1a; 只支持 GET 请求&#xff0c;需要 POST的&#xff…

Eclipse下载安装图文教程

一、下载Eclipse 1、打开 Eclipse官网 2、下载免安装版&#xff1b; 3、切换国内下载源 4、下载压缩包到本地&#xff1b; 5、下载完成后直接解压就可以使用了&#xff1b; 二、汉化 1、打开eclipse&#xff0c;点击 ‘Help’ → ‘Install new software…’ 2、点击A…

【开源免费】基于SpringBoot+Vue.JS音乐网站(JAVA毕业设计)

本文项目编号 T 109 &#xff0c;文末自助获取源码 \color{red}{T109&#xff0c;文末自助获取源码} T109&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Sonic:开源Go语言开发的高性能博客平台

Sonic&#xff1a;一个用Go语言开发的高性能博客平台 简介 Sonic&#xff0c;一个以其速度如声速般快速而命名的博客平台&#xff0c;是一个用Go语言开发的高性能博客系统。正如其名字所暗示的&#xff0c;Sonic旨在提供一个简单而强大的博客解决方案。这个项目受到了Halo项目…

Pygame Zero(pgzrun)详解(简介、使用方法、坐标系、目录结构、语法参数、安装、实例解释)

Pygame Zero&#xff08;pgzrun&#xff09;详解 &#xff08;简介、使用方法、坐标系、目录结构、语法参数、安装、实例解释&#xff09; 本文目录&#xff1a; 零、时光宝盒 一、Pygame Zero简介 二、Pygame Zero的编写游戏的一般流程 三、Pygame Zero 的坐标系 四、Py…

Java jni调用nnom rnn-denoise 降噪

介绍&#xff1a;https://github.com/majianjia/nnom/blob/master/examples/rnn-denoise/README_CN.md 默认提供了一个wav的例子 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h>#include …

图像处理-Ch7-小波函数

个人博客&#xff01;无广告观看&#xff0c;因为这节内容太多了&#xff0c;有点放不下&#xff0c;分了三节 文章目录 多分辨率展开(Multi-resolution Expansions)序列展开(Series Expansions)尺度函数(Scaling Function)例&#xff1a;哈尔尺度函数(Haar scaling func)多分…