当前位置: 首页 > news >正文

acwing算法基础之数学知识--求数a的欧拉函数值phi(a)

目录

  • 1 基础知识
  • 2 模板
  • 3 工程化

1 基础知识

数a的欧拉函数 ϕ ( a ) \phi(a) ϕ(a):表示1~n中与n互质的数的个数。其中两个数互质,是指这两个数的最大公约数为1。

根据定义,我们可以写出如下方法,

int gcd(int a, int b) {return b ? gcd(b, a % b) : a;
}int phi(int a) {int res = 0;for (int i = 1; i <= a; ++i) {if (gcd(i, a) == 1) {res += 1;}}return res;
}

但存在更快的求解方法,见如下关键步骤:

  1. 对数a进行分解质因子操作。
    a = p 1 α 1 ⋅ p 2 α 2 ⋯ p k α k a=p_1^{\alpha_1} \cdot p_2^{\alpha_2}\cdots p_k^{\alpha_k} a=p1α1p2α2pkαk
unordered_map<int,int> get_prime_divisors(int a) {unordered_map<int,int> mp;for (int i = 2; i <= a / i; ++i) {if (a % i == 0) {int s = 0;while (a % i == 0) {a /= i;s++;}mp[i] = s;}}if (a > 1) mp[a] = 1;return mp;
}
  1. 计算数a的欧拉函数,
    ϕ ( a ) = a ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) \phi(a)=a\cdot (1-\frac{1}{p_1}) \cdot (1-\frac{1}{p_2}) \cdots (1-\frac{1}{p_k}) ϕ(a)=a(1p11)(1p21)(1pk1)
int phi(int a, unordered_map<int,int> mp) {int res = a;for (auto [x, y] : mp) {res = res / x * (x - 1);}return res;
} 

可以将以上两步合并,请看如下代码,

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

2 模板

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

3 工程化

题目1:输入n个数,请分别求出它们的欧拉函数值。

#include <iostream>using namespace std;int main() {int n;cin >> n;while (n--) {int x;cin >> x;int res = x;for (int i = 2; i <= x / i; ++i) {if (x % i == 0) {res = res / i * (i - 1);while (x % i == 0) x /= i;}}if (x > 1) res = res / x * (x - 1);cout << res << endl;}return 0;
}
http://www.lryc.cn/news/229631.html

相关文章:

  • Jenkins的介绍与相关配置
  • 开源网安受邀参加网络空间安全合作与发展论坛,为软件开发安全建设献计献策
  • arcgis提取栅格有效边界
  • 后端接口性能优化分析-问题发现问题定义
  • 中国首个通过ASIL D认证的IP发布,国产芯片供应商的机会来了
  • [单片机课程设计报告汇总] 单片机设计报告常用硬件元器件描述
  • Docker学习——⑧
  • 力扣刷题第二十一天--栈与队列
  • Python基础-解释器安装
  • MySQL(14):视图
  • Blazor 附件上传和下载功能
  • Git 安装配置
  • Center Smoothing Certified Robustness for Networks with Structured Outputs
  • C#几种截取字符串的方法
  • 【PG】PostgreSQL高可用方案repmgr部署(非常详细)
  • Linux Makefile配置问题
  • k8s篇之underlay网络和overlay区别
  • 掉瓶子小游戏
  • Elasticsearch7 入门 进阶
  • 你是怎么封装微信小程序的数据请求的?
  • C++ vector中capacity()和size() 的区别
  • 【Redis】redis-server和redis-cli
  • 【系统架构设计】架构核心知识: 2.4 系统建模过程和系统设计
  • 企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理
  • ubantu libssl.so.1.1: cannot open shared object file
  • python matlplotlib/seaborn 绘制曲线的平均值标准差阴影图
  • 【Linux基础IO篇】深入理解文件系统、动静态库
  • flink 写入 starrocks 报错 too many filtered rows attachment
  • Windows 安装 Maven
  • 一文读懂关于IPv6的那些事