Part 6.2.3 欧拉函数

2024-06-20 07:28
文章标签 函数 part 欧拉 6.2

本文主要是介绍Part 6.2.3 欧拉函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欧拉函数φ(x) 表示了小于x的数字中,与x互质的数字个数。
关于欧拉函数的基本知识>欧拉函数的求解<

[SDOI2008] 仪仗队

题目描述

作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的 N × N N \times N N×N 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。

现在,C 君希望你告诉他队伍整齐时能看到的学生人数。

输入格式

一行,一个正整数 N N N

输出格式

输出一行一个数,即 C 君应看到的学生人数。

样例 #1

样例输入 #1

4

样例输出 #1

9

提示

对于 100 % 100 \% 100% 的数据, 1 ≤ N ≤ 40000 1 \le N \le 40000 1N40000

解题思路

分析问题可知,设一个点到C君的横向和纵向距离分别为m,n,没有被遮挡的充分条件是m,n互质。如何理解?如何m,n不互质,设
gcd(m,n)=p,则一定存在(m/p+1,n/p+1)在队伍中遮挡了该点。而如果m,n互质,则无法找到这个位置。

code

#include<iostream>
using namespace std;
#define MAX_N 40000
int n;
int vis[MAX_N+5];
int phi[MAX_N+5];
int prim[MAX_N+5];
int cnt=0;
void get_phi()
{phi[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){vis[i]=1;prim[++cnt]=i;phi[i]=i-1;}for(int j=1;prim[j]*i<=n;j++){int m=prim[j]*i;vis[m]=1;if(i%prim[j]==0){phi[m]=prim[j]*phi[i];break;}else{phi[m]=(prim[j]-1)*phi[i];}}}return ;
}
int main()
{cin>>n;if(n==1){cout<<0;return 0;}get_phi();long long sum=0;for(int i=2;i<=n-1;i++)sum+=phi[i];long long ans=sum*2+3;cout<<ans;return 0;} 

GCD

题目描述

给定正整数 n n n,求 1 ≤ x , y ≤ n 1\le x,y\le n 1x,yn gcd ⁡ ( x , y ) \gcd(x,y) gcd(x,y) 为素数的数对 ( x , y ) (x,y) (x,y) 有多少对。

输入格式

只有一行一个整数,代表 n n n

输出格式

一行一个整数表示答案。

样例 #1

样例输入 #1

4

样例输出 #1

4

提示

样例输入输出 1 解释

对于样例,满足条件的 ( x , y ) (x,y) (x,y) ( 2 , 2 ) (2,2) (2,2) ( 2 , 4 ) (2,4) (2,4) ( 3 , 3 ) (3,3) (3,3) ( 4 , 2 ) (4,2) (4,2)


数据规模与约定
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 7 1\le n\le10^7 1n107

来源:bzoj2818。

本题数据为洛谷自造数据,使用 CYaRon 耗时 5 5 5 分钟完成数据制作。

解题思路

如果gcd(a,b)=1,则gcd(a *p,b *p)=p。若p为质数且p<n/b,则a *p和b *p是符合题意的一组解。
求出所有数的欧拉函数以及小于n/p的质数的数量,根据其乘积便可以求出答案。

code

#include<iostream>
using namespace std;
#define MAX_N 10000000
int vis[MAX_N+5];
int prim[MAX_N+5];
int phi[MAX_N+5];
int cnt_prim[MAX_N+5];
int cnt=0;
int n;
void get_phi()
{phi[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){vis[i]=1;prim[++cnt]=i;phi[i]=i-1;}for(int j=1;prim[j]*i<=n;j++){int m=prim[j]*i;vis[m]=1;if(i%prim[j]==0){phi[m]=prim[j]*phi[i];break;}else{phi[m]=(prim[j]-1)*phi[i];}}}return ;
}
int main()
{cin>>n;get_phi();int st=0,ed=n;for(int i=cnt;i>=1;i--){st=prim[i];for(int j=st;j<=ed;j++)cnt_prim[j]=i;ed=prim[i]-1;}long long ans=0;for(int i=2;i<=n;i++){ans+=cnt_prim[n/i]*phi[i]*2;}ans+=cnt_prim[n];cout<<ans;return 0;
}

GCD SUM

题目描述

∑ i = 1 n ∑ j = 1 n gcd ⁡ ( i , j ) \sum_{i=1}^n \sum_{j=1}^n \gcd(i, j) i=1nj=1ngcd(i,j)

输入格式

第一行一个整数 n n n

输出格式

第一行一个整数表示答案。

样例 #1

样例输入 #1

2

样例输出 #1

5

提示

对于 30 % 30\% 30% 的数据, n ≤ 3000 n\leq 3000 n3000

对于 60 % 60\% 60% 的数据, 7000 ≤ n ≤ 7100 7000\leq n\leq 7100 7000n7100

对于 100 % 100\% 100% 的数据, n ≤ 1 0 5 n\leq 10^5 n105

解题思路

答题思路类似于上题。
如果gcd(a,b)=1,则gcd(a *p,b *p)=p。若p<n/b,则a *p和b *p是符合题意的一组解。
对于每一组数,无非就是gcd(a,b)=1和大于1两种情况,等于1也即互质,其数量是包括在欧拉函数中的,大于1则是根据a,b同时 *p转化而来的,易求。
和上题的区别在于,上一题维护cnt_prim数组,本题维护区间和数组sum。

code

#include<iostream>
using namespace std;
#define MAX_N 100000
int vis[MAX_N+5];
int prim[MAX_N+5];
int phi[MAX_N+5];
long long sum[MAX_N+5];
int cnt=0;
int n;
void get_phi()
{phi[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){vis[i]=1;prim[++cnt]=i;phi[i]=i-1;}for(int j=1;prim[j]*i<=n;j++){int m=prim[j]*i;vis[m]=1;if(i%prim[j]==0){phi[m]=prim[j]*phi[i];break;}else{phi[m]=(prim[j]-1)*phi[i];}}}return ;
}
int main()
{cin>>n;get_phi();for(int i=1;i<=n;i++){sum[i]=i;sum[i]+=sum[i-1];}long long ans=0;for(int i=2;i<=n;i++){ans+=phi[i]*sum[n/i]*2;}ans+=sum[n];cout<<ans;return 0;
}

这篇关于Part 6.2.3 欧拉函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1