数论技巧——使用线性筛法去求1~n之间欧拉函数的和

news2024/9/22 7:41:16

         本节是数论中的重要内容,也是算法竞赛中的常考点,初学者理解起来可能有些困难,需要多多体会

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

 欧拉函数的定义:1~n中与n互质的数的个数被称为欧拉函数,记作φ(n)

欧拉函数的性质:

1.若p是质数,则φ(p) = p-1

2.若p是质数,则φ(p^k) = (k-1)*p^(k-1)

3.欧拉函数是积性函数 ,若 gcd(m,n) = 1,则有φ(m,n) = φ(m)*φ(n)

第一个性质很好证明

第二个证明如下:

已知p^k一定可以整除 p,p^2,p^3......p^k-1

那么我们可以得出,在p^k-1与p^k之间,不可能存在别的数能整除p (p是质数)

在一个循环节中,我们可以知道共有(p-1)个数是与p互质的,那么个数是(p-1)

并且循环节一共有p^k-1个,所以定理二成立

定理三的证明读者可自行查阅资料(本觏婼不会)

欧拉函数的计算公式:

由唯一分解性定理可知,n = p1^a1*p2^a2......pk^ak

则φ(n) = \prodφ(pi^ai)

           = \prod(pi-1)*p^(ai-1)

           = \prodp^ai*\prod(1-(1/pi))

           = n*\prod(1-(1/pi))

所以φ(n) = n*((p1-1)/p1)*((p2-1)/p2).....

欧拉函数仅与n和其只因子有关,与次数无关

这时我们可以根据定义,用试除法来求欧拉函数

int phi(int n) // 用试除法求欧拉函数 
{
	int res = n;
	for(int i=2;i<=n/i;i++)
	{
		if(n%i==0)
		{
			res = res*(i-1)/i;
			while(n%i==0) n /= i;
		}
	}
	if(n>0) res = res*(n-1)/n;
	return res;
}

此算法的复杂度较高,有局限性,我们考虑优化

使用线性筛法求欧拉函数

在线性筛法中,每个合数m都是被其最小的只因子筛掉的

我们从小到大枚举i,并且满足不超过n

若i可以整除pj(最小只因子),那么i包含了m的所有只因子         φ(m) = pj*φ(i)

否则的话i与pj 是互质的        φ(m) = φ(pj)*φ(i) = (pj-1)*(φ(i))

const int N = 100010;
int p[N],cnt; // p数组是存储只因子个数,cnt记录数量 
int phi[N];  // phi 是欧拉函数 
bool vis[N]; // 标记应该去掉的合数 

void get_phi(int n) // 线性筛法求欧拉函数 
{
	phi[1] = 1;
	for(int i=2;i<=n;i++)
	{
		if(!vis[i]) // 没有划掉的话证明i是质数 
		{
			p[cnt++] = i; // 将这个最小只因子存储下来 
			phi[i] = i-1; // 定理一 
		}
		for(int j=0;i*p[j]<=n;j++)
		{
			// 这里的步骤已经给出证明 
			int m = i*p[j];
			vis[m] = false;
			if(i%p[j]==0)
			{
				phi[m] = phi[i]*p[j];
				break;
			}
			else phi[m] = phi[i]*(p[j]-1);
		}
	}
}

下面的话给出本题的完整代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

const int N = 1000010;
typedef long long LL;
int p[N],cnt;
int phi[N];
bool vis[N];

void get_phi(int n)
{
	phi[1] = 1;
	
	for(int i=2;i<=n;i++)
	{
		if(!vis[i])
		{
			p[cnt++] = i;
			phi[i] = i-1;
		}
		for(int j=0;p[j]*i<=n;j++)
		{
			int m = i*p[j];
			vis[m] = true;
			if(i%p[j]==0)
			{
				phi[m] = phi[i]*p[j];
				break;
			}
			else phi[m] = phi[i]*(p[j]-1);
		}
	}
	return;
}

int main(void)
{
	int n;cin >> n;
	LL res = 0;
	
	get_phi(n);
	for(int i=1;i<=n;i++)
		res+=phi[i]; 
	
	cout << res << endl;
	return 0;
 } 

如果你还是不太懂的话,建议去小破站看看董晓老师讲的算法课

飞机票:【G09 筛法求欧拉函数】https://www.bilibili.com/video/BV1VP411p7Bs?vd_source=703af51dc566d98822b7573adab52f24

感谢查看,如果对你有帮助的话,点个赞呗

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

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

相关文章

操作系统 ---- 进程的概念、组成、特征

学习路线&#xff1a; 一、进程的概念及组成 我们通过一个例子来说明进程的概念以及程序和进程的区别。 我们在Windows操作系统中打开任务管理器&#xff0c;在任务管理器当中能看到此时系统当中运行的进程有哪些&#xff0c;如下图所示&#xff1a; 此时&#…

【前端】vue+html+js 实现table表格展示,以及分页按钮添加

一. 问题描述 数据条数太多显示到页面上时可能会渲染较慢&#xff0c;因此需要截取数据进行展示。 二. 代码写法 思路&#xff1a;按照上述图示思路&#xff0c;需要有两个数据列表&#xff0c;一个存储的是所有的列表数据&#xff0c;一个存储的是展示的数据列表&#xff0c…

蒙特卡罗——三门问题python代码实现

三门问题 b站李永乐老师讲解三门问题 python蒙特卡罗模拟 #模拟三门问题 import random as rd #n:模拟次数,m:中奖次数 n100000 m0 for i in range(n):#车位于的门号carrd.randint(0,2)#人随机选择一个门doorrd.randint(0,2)#主持人展示空门empties{0,1,2}-{car,door}emptyrd…

jmeter基准测试详解

配置基准测试策略&#xff1a;单线程连续发送请求5分钟 脚本&#xff1a;基准测试.jmx 提取码: 0000 登录接口换成自己需要的登录接口即可 一、基准测试脚本配置 线程组下添加图表插件&#xff1a;TPS、响应时间、服务器资源 linux服务器在serveragent目录下启动serveragen…

Golang | Leetcode Golang题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; func longestSubstring(s string, k int) (ans int) {for t : 1; t < 26; t {cnt : [26]int{}total : 0lessK : 0l : 0for r, ch : range s {ch - aif cnt[ch] 0 {totallessK}cnt[ch]if cnt[ch] k {lessK--}for total > t {ch : s[…

智能翻译新时代:深入解析AI驱动的翻译软件优势

现在语言已经不再是我们学习交流的难点了&#xff0c;因为我们的身边涌现了一批类似百度在线翻译这样的翻译工具为我们与不了的语言直接搭建其一个桥梁。这次我们就来一起探讨有什么好用的翻译工具吧。 1.福昕在线翻译 链接直达&#xff1a;https://fanyi.pdf365.cn/doc 对…

[Redis] Redis中的String类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

comfyui中的几种inpainting工作流对比

inpainting方法集合_sdxl inpaint教程-CSDN博客文章浏览阅读150次。1.32G,通过它可以将所有的sdxl模型转成sdxl_inpaint模型,源于fooocus_inpaint_head,将9个通道压缩为4个通道的小型卷积网络,标准模型unet有4个通道,重绘模型有9个通道,inpaint_model_head和inpaint mode…

Jupyter Notebook 修改默认路径

Jupyter Notebook 修改默认路径 1、默认路径 安装anaconda后&#xff0c;jupyter notebook默认路径下很多文件&#xff0c;很乱&#xff0c;所以为了创建一个干净的文件夹专门存放我的python项目&#xff0c;修改jupyter notebook的文件路径 这是我现在打开jupyter notebook…

常见概念 -- 光回波损耗

什么是回波损耗 回波损耗&#xff0c;又称为反射损耗&#xff0c;当高速信号进入或退出光纤的某个部分&#xff08;例如光纤连接器&#xff09;&#xff0c;不连续和阻抗不匹配会引起反射&#xff0c;这就是光纤回波损耗。器件的回波损耗Return Loss(RL)是光信号的输入端口的反…

【信创】推荐一款在龙芯CPU终端上使用的WiFi接收器 _ 统信 _ 麒麟

原文链接&#xff1a;【信创】推荐一款在龙芯CPU终端上使用的WiFi接收器 | 统信 | 麒麟 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在龙芯CPU架构的台式机上如何安装和使用无线WiFi接收器的文章。对于使用龙芯CPU的台式机用户来说&#xff0c;安装并配置WiF…

新版智慧职教(zjy2域名开头的)怎么下载课件?一篇文章教会你

文章目录 1、引言2、痛点3、解决方法 &#x1f343;作者介绍&#xff1a;双非本科大四网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发&#xff0c;目前开始人工智能领域相关知识的学习 &#x1f985;个人主页&#xff…

Redis面试必备:Redis两种内存回收策略,Redis键空间、过期字典等

请记住胡广一句话&#xff0c;所有的中间件所有的框架都是建立在基础之上&#xff0c;数据结构&#xff0c;计算机网络&#xff0c;计算机原理大伙一定得看透&#xff01;&#xff01;~ 1. Redis数据库 1.1 Redis数据库的理解 我们可以把Redis的数据库和MySQL的数据库理解成…

运维学习————Zabbix监控框架(1)

目录 一、监控 1、概念 2、作用 3、创建监控框架 老牌监控框架 新款王牌监控框架 二、zabbix简介 1、概述 2、核心功能 三、主要组件及运行原理 1、主要组件 Zabbix Server Zabbix Agent Zabbix Proxy Zabbix Web 界面 数据库 其他 2、监控架构原理图 原…

通义千问Qwen2-7b-instruct部署

前言 https://www.modelscope.cn/models/qwen/Qwen2-7B-Instruct 其实完全可以按照这个介绍来装&#xff0c;不过容易遇到一些问题&#xff0c;新学习&#xff0c;也是记录一下 环境 python 3.10 在自己电脑上用conda创建一个新环境找租用的服务器租一台&#xff0c;3090一…

超微小间距COB大尺寸LED智能会议一体机玩转高清视频会议显示市场

在当今这个数字化飞速发展的时代&#xff0c;高清视频会议已成为企业沟通协作不可或缺的一部分。随着技术的不断革新&#xff0c;超微小间距COB大尺寸LED智能会议一体机以其卓越的性能和多元化的功能&#xff0c;正逐步引领并重塑高清视频会议显示市场的格局。这款集大成者的诞…

Android SystemUI组件(05)状态栏-系统状态图标显示管理

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注下方 SystemBars分析中状态栏中的部分-系统状态图标显示&管理 即可。 1 系统状态图标显…

基于Python的机器学习系列(32):PyTorch - 循环神经网络(RNN)

在本篇文章中&#xff0c;我们将探索循环神经网络&#xff08;RNN&#xff09;&#xff0c;这是一种特别适用于时间序列数据或文本数据的神经网络模型。在RNN中&#xff0c;当前的输出不仅取决于当前的输入&#xff0c;还受到前一步输出的影响&#xff0c;从而能够捕捉序列数据…

Java 入门指南:JVM(Java虚拟机)—— Java 类文件结构

文章目录 字节码JVM 与字节码字节码的生成过程 Class 文件结构魔数&#xff08;Magic Number&#xff09;Class 文件版本号&#xff08;Minor&Major Version&#xff09;常量池&#xff08;Constant Pool&#xff09;访问标志(Access Flags)前类&#xff08;This Class&…

Pygame中Sprite类实现多帧动画3-3

4 使用自定义类MySprite 使用自定义类MySprite实现多帧动画的步骤是首先创建MySprite类的实例&#xff0c;之后使用相关函数对该实例进行操作。 4.1 创建MySprite类的实例 创建MySprite类的实例的代码如图12所示。 图12 创建MySprite类的实例的代码 其中&#xff0c;变量dr…