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

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

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

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