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

相关文章

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详