算法中的数学:欧拉函数

1.相关定义

互质:a与b的最大公约数为1

欧拉函数:在1~n中,与n互质的数的个数就是欧拉函数的值

eg:

n=1时,欧拉函数的值为1,因为1和1是互质的

n=2是,值为2,因为1和2都是互质的


积性函数:f(1)= 1且f(xy) = f(x)f(y),其中x与y互质

2.欧拉函数

性质:
1.若p为质数,则:φ(p) = p-1

解析:

因为p是质数,所以在1~p中与p有除了1以外的公约数的只有p本身,总共的数的个数为p,所以与p互质的数就是p-1个,即φ(p) = p-1
2.若p为质数,则:φ(p^k) = (p-1)p^(k-1)

解析:
对p^k进行分解质因数:p^k = p*p*p*p...*p(共k个)

我们发现p^k只有p本身,而p是质数,不能由其他数组合而成,所以p^k只能与p的倍数有除了1以外的公约数,而我们以每一个倍数的p为一个周期看待,每个周期内有p-1个与p^k

互质的数

3.欧拉函数属于积性函数

即φ(xy) = φ(x)φ(y)

3.试除法求单个数欧拉函数 

公式解释:单个数n的欧拉函数就是n乘上(pi-1)/pi的连乘

公式推导:

1.对n分解质因数

2.由于欧拉函数是积性函数,所以我们可以直接拆分开

3.由于pi是质数,根据欧拉函数的性质(若p为质数,则:φ(p^k) = (p-1)p^(k-1)),得到结果式子

4.我们将pi^(αi-1)中的pi^(-1)分离出去给到(pi-1),于是就得到了(pi-1)/pi

5.根据pi的连乘是n分解质因数的得到的,所以pi的连乘换成n,得证

代码实现:
 

int phi(int n)
{int answer = n;for (int i = 2; i <= n / i; i++){if (n % i == 0){answer = answer / i * (i - 1);//先除后乘防止溢出while (n % i == 0) n /= i;}}if (n > 1) answer = answer / n * (n - 1);return answer;
}

4.欧拉筛打表欧拉函数

我们可以在进行线性筛的时候顺便计算记录下对应数据的欧拉函数

线性筛代码如下:
 

typedef long long ll;
const int N = 1e9;
bool f[N];
int a[N];
int count;
void get_prime(int n)
{for(ll i = 2; i <= n; i++){
//没有被标记为true,说明是质数if(f[i] == false) {a[++count] = i;}
//进行线性筛for(int j = 1; i*a[j] <= n; j++){f[i*a[j]] = true;if(i % a[j] == 0) break;{          }
}

若数据是质数:根据欧拉函数的性质,欧拉函数的值就是该数-1

若数据不是质数:

(1)i%a[j] != 0:且a[j]是质数,所以i与a[j]互质,此时根据欧拉函数的性质

(φ(xy) = φ(x)φ(y))可知,φ(x) = φ(i)*φ(a[j])

(2)i%a[j] == 0: φ(x) = φ(i)*a[j]

证明如下:

打表代码:
 

typedef long long ll;
const int N = 1e9;
bool f[N];
int a[N];
int count;
int phi[N];
void get_prime(int n)
{phi[1] = 1;for(ll i = 2; i <= n; i++){
//没有被标记为true,说明是质数if(f[i] == false) {a[++count] = i;phi[i] = i - 1;}
//进行线性筛for(int j = 1; i*a[j] <= n; j++){int x = i * a[j];f[i*a[j]] = true;if(i % a[j] == 0) {phi[x] = a[j] * phi[i];break;}else{phi[x] = phi[i] * (p[j]-1);}}          }
}

5.例题讲解

 

审题:

本题需要我们找到从坐标原点出发可以直接看到的坐标个数

思路:
方法一:分析+欧拉函数

我们建立坐标徐后可以清楚发现,只要点在同一条从原点出发的直线路径上,就只有第一个点可以被直接看到,其他的点都会被遮住。

而被遮住的点可以通过除以横纵坐标的最大公约数变成第一个可以被看见的点,由于这个特性,我们发现最大公约数不为1的横纵坐标的点都会被遮住(因为他们都可以转换成直线上第一个被看见的点)

故可以被看见的点就是横纵坐标互质的点,接下来我们分析如何求

首先我们分析第五列的点(先不看在坐标轴上的点),我们发现横纵坐标互质的点的个数(可以被看到的数)其实就是当前横坐标的欧拉函数。

故我们可以直接将1~n-1的数的欧拉函数累加起来,然后就得到了下半边的可看到点位数,再根据对称轮换,我们对结果乘2可以得到上下两边的可看到点数。但是此时我们的(1,1)被计算了两次(要减1),而坐标轴上的(1,0)和(0,1)两点还没加上(要加2),综合起来我们就要在当前结果的基础上加一.

解题:

#include<iostream>
using namespace std;
typedef long long ll;
const int N = 4e4 + 10;
int n;
//线性筛所需变量
bool st[N];
ll p[N],cnt;
ll phi[N];//欧拉函数
void get_phi()
{phi[1] = 1;for (ll i = 2; i <= n; i++){if (!st[i]){p[++cnt] = i;phi[i] = i - 1;}for (ll j = 1; i * p[j] <= n; j++){st[i * p[j]] = true;ll x = i * p[j];if (i % p[j] == 0){phi[x] = phi[i] * p[j];break;}else//i 与p[j]互质{phi[x] = phi[i] * (p[j] - 1);}}}
}
int main()
{cin >> n;get_phi();ll sum = 0;for (int i = 1; i < n; i++){sum += phi[i];}if (n == 1) cout << 0 << endl;elsecout << sum * 2 + 1 << endl;return 0;
}

其中计算欧拉函数就是使用线性筛来完成。

注意:累加的时候不要加到i==n的情况,因为我们的坐标是从0开始的,所以访问到i==n其实就是越界访问

P2158 [SDOI2008] 仪仗队 - 洛谷

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

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

相关文章

BaseDao指南

1. BaseDao类 import java.sql.*;/*** 通用的工具类 ,负责连接数据&#xff0c; 执行增删改查的通用方法*/ public class BaseDao {private Connection connection;private PreparedStatement pstm;private ResultSet rs;/*** 建立数据库连接** return*/public Boolean getCon…

SpringBoot JAR 启动原理

文章目录 版本概述JAR 包结构MANIFEST.MF 描述文件JarLauncherArchive 接口launch 方法Handlers.register() 方法getClassPathUrls 方法createClassLoader 方法 时序图参考 版本 Java 17SpringBoot 3.2.4 概述 JAR 启动原理可以简单理解为“java -jar的启动原理” SpringBo…

YOLO11解决方案之速度估算探索

概述 Ultralytics提供了一系列的解决方案&#xff0c;利用YOLO11解决现实世界的问题&#xff0c;包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 YOLO速度估算结合物体检测和跟踪技术&#xff0c;使用YOLO11 模型检测每帧中的物体&#xf…

初识C++:模版

本篇博客主要讲解C模版的相关内容。 目录 1.泛型编程 2.函数模板 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 1.隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2. 显式实例化&#xff1a;在函数名后的<>中指定模…

人工智能100问☞第27问:神经网络与贝叶斯网络的关系?

神经网络与贝叶斯网络是两种互补的智能模型:神经网络通过多层非线性变换从数据中学习复杂模式,擅长大规模特征提取和预测,而贝叶斯网络基于概率推理建模变量间的条件依赖关系,擅长处理不确定性和因果推断。两者的融合(如贝叶斯神经网络)结合了深度学习的表征能力与概率建…

【node.js】入门基础

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js简介1.1 Node.js的核心特点1.2 Node.js适用场景 2. 第一个Node.js程序2.1 创建并运行Hello World2.2 创建简单的HTTP服务器 3. Node.js核心概念3.1 模块系统3.1.1 创建和导出模块3.1.2 导入和使用模…

百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%

百度飞桨 PaddleOCR 3.0 开源发布 2025 年 5 月 20 日&#xff0c;百度飞桨团队正式发布了 PaddleOCR 3.0 版本&#xff0c;并将其开源。这一新版本在文字识别精度、多语种支持、手写体识别以及高精度文档解析等方面取得了显著进展&#xff0c;进一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL开发实战指南(AIDL版)

Android 14 Binderized HAL开发实战指南&#xff08;AIDL版&#xff09; 环境要求 Android 14源码编译环境AOSP android-14.0.0_r7分支Soong build系统Java 17 & NDK r25c 项目结构 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 创造美好的代价是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是欢乐。 时间是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能从容面对…

交安安全员:交通工程安全领域的关键角色

在交通工程这个庞大而复杂的领域中&#xff0c;交安安全员扮演着举足轻重的角色&#xff0c;他们是安全的捍卫者&#xff0c;是交通工程顺利推进的重要保障。​ 交安安全员&#xff0c;专门从事公路水运工程施工企业安全生产管理工作。他们的专业身份由交通运输部门颁发的交安…

实验-设计一个应用系统(计算机组成原理)

目录 一. 实验内容 二. 实验步骤 &#xff08;1&#xff09;七段数码管显示模块 &#xff08;2&#xff09;指令模块 &#xff08;3&#xff09;控制模块 &#xff08;4&#xff09;ALU模块 &#xff08;5&#xff09;CPU模块 三. 实现效果 四. 实验环境 五. 实验小结…

【博客系统】博客系统第四弹:令牌技术

令牌机制 为什么不能使用 Session 实现登录功能&#xff1f; 传统思路&#xff1a; 登录页面把用户名密码提交给服务器。服务器端验证用户名密码是否正确&#xff0c;并返回校验结果给前端。如果密码正确&#xff0c;则在服务器端创建 Session。通过 Cookie 把 sessionId 返回…

【瑞数3代】药监评审中心逆向分析 | 后缀MmEwMD参数

1.目标 目标网址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫话机器学习系列】274.基尼指数(Gini Index)

决策树中的基尼指数&#xff08;Gini Index&#xff09;详解 —— 从公式理解到实际应用 在构建决策树模型时&#xff0c;一个核心问题是&#xff1a;如何选择最优的特征来进行节点划分&#xff1f; 这就涉及到了“划分准则”的问题。常见的准则有信息增益、信息增益率以及本文…

R语言学习--Day07--T分布与T检验

昨天我们介绍了R中用于对数据进行分类的聚类分析的方法&#xff0c;接下来我们来看T分布。 T分布 T分布适用于帮我们估计整组数据&#xff08;较小的数据量&#xff0c;一般小于30&#xff09;的真实值在哪一个区间&#xff0c;具体是计算置信区间&#xff08;一般为95%&#…

数据结构与算法-线性表-双向链表(Double Linked List)

1 线性表 1.4 双向链表&#xff08;Double Linked List&#xff09; 双向链表的结点中有两个指针域&#xff0c;一个指向直接后继&#xff0c;另一个指向直接前驱&#xff0c;主要是为了解决前向查找的问题。 双向链表结构&#xff1a; 书籍和视频教程都只讲解了插入和删除的…

甘特图实例 dhtmlxGantt.js

本文介绍了如何使用dhtmlxGantt库创建一个基础的甘特图示例&#xff0c;并对其进行汉化和自定义配置。首先&#xff0c;通过引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特图。接着&#xff0c;通过设置gantt.i18n.setLocale("cn")实现核心文本的汉化&#xff0…

C++23 新增扁平化关联容器详解

文章目录 一、引言已有关联容器回顾新容器的引入原因 二、std::flat_set定义与特性代码示例适用场景 三、std::flat_multiset定义与特性代码示例适用场景 四、std::flat_map定义与特性代码示例适用场景 五、std::flat_multimap定义与特性代码示例适用场景 六、与其他容器的比较…

使用zap,对web应用/API接口 做安全检测

https://www.zaproxy.org/getting-started/ 检测方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 执行baseline测试 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 执行api测试 docker run -t ghcr.io/zaproxy/zaproxy…

Qt—模态与非模态对话框

Qt—模态与非模态对话框 核心概念 ​模态对话框​​&#xff1a;强制用户优先处理当前窗口&#xff0c;阻塞指定范围的用户交互。​非模态对话框​​&#xff1a;允许用户自由切换窗口&#xff0c;无交互限制。 一、模态对话框类型与行为 1. 应用级模态&#xff08;Applica…