《算法竞赛进阶指南》0x32_2约数

2024-08-30 12:04

本文主要是介绍《算法竞赛进阶指南》0x32_2约数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义
∀ a , b ∈ N , 若 g c d ( a , b ) = 1 , 则称 a , b 互质 \forall a,b \in \mathbb{N},若gcd(a,b)=1,则称a,b互质 a,bN,gcd(a,b)=1,则称ab互质
对于三个数或更多个数的情况,我们把 g c d ( a , b , c ) = 1 gcd(a,b,c)=1 gcd(a,b,c)=1的情况称为a,b,c互质。把 g c d ( a , b ) = g c d ( a , c ) = g c d ( b , c ) = 1 gcd(a,b)=gcd(a,c)=gcd(b,c)=1 gcd(a,b)=gcd(a,c)=gcd(b,c)=1称为a,b,c两两互质。后者显然是一个更强的条件。
欧拉函数
[1,N]中与N互质的数的个数被称为欧拉函数,记为 ϕ ( N ) \phi(N) ϕ(N)
若在算数基本定理中, N = p 1 c 1 p 2 c 2 . . . p m c m N=p_1^{c_1}p_2^{c_2}...p_m^{c_m} N=p1c1p2c2...pmcm,则:
ϕ ( N ) = N ∗ p 1 − 1 p 1 ∗ p 2 − 1 p 2 ∗ . . . ∗ p m − 1 p m = N ∗ ∏ 质数 p ∣ N ( 1 − 1 p ) \phi(N)=N*\frac{p_1-1}{p1}*\frac{p_2-1}{p2}*...*\frac{p_m-1}{pm}=N*\prod\limits_{质数p|N}(1-\frac{1}{p}) ϕ(N)=Np1p11p2p21...pmpm1=N质数pN(1p1)

证明:
设p是N的质因子,[1,N]中p的倍数有p,2p,3p,…,(N/p)*p,共N/p个。若q也是N的质因子,则[1,N]中q的倍数有N/q个。如果我们把这N/p+N/q个数去掉,那么p*q的倍数被去掉了两次,需要加一次回来。
因此[1,N]中不与N含有任何共同质因子p或q的数的个数为:
N − N p − N q + N p q = N ( 1 − 1 p ) ( 1 − 1 q ) N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}=N(1-\frac{1}{p})(1-\frac{1}{q}) NpNqN+pqN=N(1p1)(1q1)
实际上这种思想叫做容斥原理,在N的全部质因子上使用容斥原理,可得到[1,N]中不与N含有任何公共质因子的数的个数,也就是与N互质的数的个数。

根据欧拉函数的计算式,我们只需要分解质因数,便可以顺便求出欧拉函数。

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

性质1-2
1. ∀ n > 1 , [ 1 , n ] 中与 n 互质的数的和为 n ∗ ϕ ( n ) / 2 \forall n > 1,[1,n]中与n互质的数的和为n*\phi(n)/2 n>1,[1,n]中与n互质的数的和为nϕ(n)/2
2. 若 a , b 互质 , 则 ϕ ( a b ) = ϕ ( a ) ∗ ϕ ( b ) 若a,b互质,则\phi(ab)=\phi(a)*\phi(b) a,b互质,ϕ(ab)=ϕ(a)ϕ(b)

证明:
因为 g c d ( n , x ) = g c d ( n , n − x ) gcd(n,x)=gcd(n,n-x) gcd(n,x)=gcd(n,nx),所以与n不互质的数x,n-x成对出现,平均值为n/2,因此与n互质的数平均值也是n/2,可得性质1。
根据欧拉函数的计算式,对a,b分解质因数直接可得性质2。

积性函数
如果a,b互质,有 f ( a b ) = f ( a ) ∗ f ( b ) f(ab)=f(a)*f(b) f(ab)=f(a)f(b),那么称函数f为积性函数。

性质3-6
3.若f是积性函数,且在算术基本定理中 n = ∏ i = 1 m p i c i n=\prod_{i=1}^{m}p_i^{c_i} n=i=1mpici,则 f ( n ) = ∏ i = 1 m f ( p i c i ) f(n)=\prod_{i=1}^{m}f(p_i^{c_i}) f(n)=i=1mf(pici)
4.设p为质数,若 p ∣ n p|n pn p 2 ∣ n p^2|n p2n,则 ϕ ( n ) = ϕ ( n / p ) ∗ p 。 \phi(n)=\phi(n/p)*p。 ϕ(n)=ϕ(n/p)p
5.设p为质数,若 p ∣ n p|n pn p 2 ! ∣ n p^2!|n p2!n,则 ϕ ( n ) = ϕ ( n / p ) ∗ ( p − 1 ) 。 \phi(n)=\phi(n/p)*(p-1)。 ϕ(n)=ϕ(n/p)(p1)
6. ∑ d ∣ n ϕ ( d ) = n \sum_{d|n}\phi(d)=n dnϕ(d)=n

证明:
性质3显然。
p ∣ n p|n pn p 2 ∣ n p^2|n p2n,则n,n|p包含相同的质因子,只是p的指数不同,把两者按照欧拉函数的计算公式写出,二者相除,商为p,所以性质4成立。
p ∣ n p|n pn p 2 ! ∣ n p^2!|n p2!n则p,n|p互质, ϕ ( n ) = ϕ ( n / p ) ∗ ϕ ( p ) \phi(n)=\phi(n/p)*\phi(p) ϕ(n)=ϕ(n/p)ϕ(p),而 ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p1,所以性质5成立。

利用线性筛求1到n所有数的欧拉函数

void init(int n)
{phi[1] = 1;for (int i = 2; i <= n; i ++ ){if (!st[i]){prime[cnt ++ ] = i;phi[i] = i - 1;}for (int j = 0; prime[j] * i <= n; j ++ ){st[i * prime[j]] = 1;if(i % prime[j] == 0){phi[i * prime[j]] = phi[i] * prime[j];//性质4break;}phi[i * prime[j]] = phi[i] * (prime[j] - 1);//性质5}}
}

acwing203.可见的点

如果所有的点与原点的连接构成直线 y = a b x y=\frac{a}{b}x y=bax的话,本题要求的就是在1到n范围内互质的(a,b)的对数是多少,按照y=x分成上下两部分,本题的答案即为 2 ∗ ϕ ( n ) + 1 2*\phi(n)+1 2ϕ(n)+1

#include <iostream>
using namespace std;
#define N 1010
bool st[N];
int prime[N];
int phi[N];
int cnt = 0;void init(int n)
{phi[1] = 1;for (int i = 2; i <= n; i ++ ){if (!st[i]){prime[cnt ++ ] = i;phi[i] = i - 1;}for (int j = 0; prime[j] * i <= n; j ++ ){st[i * prime[j]] = 1;if(i % prime[j] == 0){phi[i * prime[j]] = phi[i] * prime[j];break;}phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}
}
int main()
{init(N - 1);int n, m;cin >> m;for (int T = 1; T <= m; T ++ ){int ans = 1;cin >> n;for (int k = 1; k <= n; k ++ ) ans += 2 * phi[k];cout << T << ' ' << n << ' ' << ans << endl;}return 0;
}

这篇关于《算法竞赛进阶指南》0x32_2约数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120768

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

macOS彻底卸载Python的超完整指南(推荐!)

《macOS彻底卸载Python的超完整指南(推荐!)》随着python解释器的不断更新升级和项目开发需要,有时候会需要升级或者降级系统中的python的版本,系统中留存的Pytho版本如果没有卸载干... 目录MACOS 彻底卸载 python 的完整指南重要警告卸载前检查卸载方法(按安装方式)1. 卸载

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py