【算法学习笔记】32:筛法求解欧拉函数

devtools/2025/1/18 7:42:41/

上节学习的是求一个数 n n n欧拉函数,因为用的试除法,所以时间复杂度是 O ( n ) O(\sqrt{n}) O(n ),如果要求 m m m个数的欧拉函数,那么就会花 O ( m n ) O(m \sqrt{n}) O(mn )的时间。如果是求连续一批数的欧拉函数,可以用筛法进行优化。

筛法求欧拉函数原理

线性筛质数时可以顺便把每个数的欧拉函数筛出来。根据线性筛过程,一个数要么是质数被pick出来,要么是合数被筛掉,一共有这样三个地方:

  1. 从筛子(st数组)里发现 i i i是一个质数
  2. 合数 p r i m e s [ j ] ∗ i primes[j] * i primes[j]i被筛掉,其中质数 p r i m e s [ j ] primes[j] primes[j]同时也是 i i i的质因子(按照线性筛,也一定是最小质因子)
  3. 合数 p r i m e s [ j ] ∗ i primes[j] * i primes[j]i被筛掉,其中质数 p r i m e s [ j ] primes[j] primes[j]不是 i i i的质因子(仅仅是 p r i m e s [ j ] ∗ i primes[j] * i primes[j]i的最小质因子)

三种情况合起来就不多不少地包含了从 1 1 1 n n n的所有数字。

  • 对于情况1,质数 i i i欧拉函数根据定义就是除了 i i i之外的那 i − 1 i - 1 i1个数,因为它们一定都和 i i i互质,所以 ϕ ( i ) = i − 1 \phi(i) = i - 1 ϕ(i)=i1
  • 对于情况2,因为 p r i m e s [ j ] primes[j] primes[j]也是 i i i的质因子,根据欧拉公式,除了第一项外剩下那些用1减的项,都只和质因子有关,和质因子的指数无关,因此相比 ϕ ( i ) \phi(i) ϕ(i) ϕ ( p r i m e s [ j ] ∗ i ) \phi(primes[j] * i) ϕ(primes[j]i)只有第一项从 i i i变成了 p r i m e s [ j ] ∗ i primes[j] * i primes[j]i
  • 对于情况3,因为 p r i m e s [ j ] primes[j] primes[j]是一个质数而且和 i i i互质,因此 ϕ ( p r i m e s [ j ] ∗ i ) \phi(primes[j] * i) ϕ(primes[j]i)的公式里,除了第一项要变成 p r i m e s [ j ] ∗ i primes[j] * i primes[j]i,还因为添加了一个新的质数 p r i m e s [ j ] primes[j] primes[j]所以要乘以一个 1 − 1 p r i m e s [ j ] 1 - \frac{1}{primes[j]} 1primes[j]1,所以总共要乘以 p r i m e s [ j ] − 1 primes[j] - 1 primes[j]1

例题:AcWing 874. 筛法求欧拉函数

只要利用线性筛的模板和上面的结论,在三个地方填空即可。

#include <iostream>using namespace std;typedef unsigned long long ULL;const int N = 1e6 + 10;int primes[N], cnt;
bool st[N];
int eulars[N];int main() {int n; cin >> n;eulars[1] = 1;for (int i = 2; i <= n; i ++ ) {if (!st[i]) {primes[cnt ++ ] = i;// i是质数,从1到i-1都和i互质eulars[i] = i - 1;}for (int j = 0; primes[j] * i <= n; j ++ ) {st[primes[j] * i] = true;if (i % primes[j] == 0) {// primes[j]是i的质因子,欧拉公式里只要变第一项eulars[primes[j] * i] = eulars[i] * primes[j];break;}// primes[j]不是i的质因子,欧拉公式里要变第一项和(1-1/primes[j])那项eulars[primes[j] * i] = eulars[i] * (primes[j] - 1);}}ULL res = 0;for (int i = 1; i <= n; i ++ ) {res += eulars[i];}cout << res << endl;return 0;
}

http://www.ppmy.cn/devtools/151501.html

相关文章

DNS服务学习

DNS服务 一、什么是DNS服务二、概念三、疑问四、内容五、应用实践 一、什么是DNS服务 二、概念 三、疑问 四、内容 五、应用实践 windows server 2019 搭建dns服务器

浅谈云计算20 | OpenStack管理模块(下)

OpenStack管理模块&#xff08;下&#xff09; 五、存储管理5.1 存储管理概述 5.2 架构设计5.2.1 Cinder块存储架构5.2.2 Swift对象存储架构 六、网络管理6.1 网络管理概述6.2 架构解析6.2.1 Neutron网络服务架构6.2.2 网络拓扑架构 6.3 原理与流程6.3.1 网络创建原理6.3.2 网络…

如何在vue中渲染markdown内容?

文章目录 引言什么是 markdown-it&#xff1f;安装 markdown-it基本用法样式失效&#xff1f;解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中&#xff0c;Markdown 作为一种轻量级的标记语言&#xff0c;广泛用于文档编写、内容管理以及富文本编辑器中。markdown…

Spring Boot环境配置

一、Java开发环境 确保你的计算机已经安装了Java Development Kit&#xff08;JDK&#xff09;。建议使用JDK 17&#xff0c;可以从Oracle官方网站上下载并安装。 1.下载及配置环境变量 &#xff08;1&#xff09;下载JDK&#xff1a;官网下载 &#xff08;2&#xff09;运…

ASP.NET Core 全局异常处理

一、引言 在ASP.NET Core 的开发过程中&#xff0c;全局异常处理是保障应用程序健壮性与稳定性的关键环节。当应用程序遭遇未预料的错误时&#xff0c;妥善的异常处理机制不仅能够避免程序崩溃&#xff0c;还能为用户提供清晰、友好的反馈&#xff0c;同时帮助开发者快速定位和…

Elasticsearch单机安装

下载 Past Releases of Elastic Stack Software | Elastichttps://www.elastic.co/downloads/past-releases找到需要下载的版本并上传到服务器 解压 配置 elasticsearch.yml config目录下 # Elasticsearch Configuration # # NOTE: Elasticsearch comes with reasonable de…

unity——Preject3——场景搭建

1.找到对应的美术资源 放到场景中改名BeginScene 2.组件不用的先移除 3.效果图片

会话_JSP_过滤器_监听器_Ajax

第8章 会话_JSP_过滤器_监听器_Ajax 8.1 会话 8.1.1 会话管理概述 1、为什么需要会话管理 HTTP是无状态协议&#xff1a; 无状态就是不保存状态&#xff0c;即无状态协议(stateless)&#xff0c;HTTP协议自身不对请求和响应之间的通信状态进行保存&#xff0c;也就是说&…