数论 - 分解质因数+欧拉函数

文章目录

  • 数论 - 分解质因数+欧拉函数
    • 一、分解质因数
    • 二、欧拉函数
    • 三、模板: Relatives POJ - 2407

一、分解质因数

由 算 术 基 本 定 理 , 任 何 一 个 大 于 1 的 自 然 数 N , 如 果 N 不 为 质 数 , 那 么 N 可 以 唯 一 分 解 成 有 限 个 质 数 的 乘 积 N = P 1 a 1 P 2 a 2 P 3 a 3 . . . . . . P n a n , 这 里 P 1 < P 2 < P 3 . . . . . . < P n 均 为 质 数 , 其 中 指 数 a i 是 正 整 数 。 现 给 定 一 个 正 整 数 n , 可 以 以 小 于 O ( n ) 的 时 间 复 杂 度 得 到 其 所 有 的 质 因 子 及 每 个 质 因 子 对 应 的 幂 。 即 得 到 P 1 , P 2 , . . . , P n 和 a 1 , a 2 , . . . , a n 。 同 质 数 判 定 的 方 法 类 似 , 需 要 另 外 注 意 两 点 : ① 、 依 然 是 i 从 2 开 始 枚 举 每 个 质 因 子 , 每 次 枚 举 到 一 个 质 因 子 就 从 n 中 把 i 除 尽 , 这 样 可 以 保 证 合 数 因 子 被 除 掉 。 ② 、 对 任 意 的 n , 至 多 仅 有 一 个 大 于 n 的 质 因 子 。 因 为 显 然 假 设 大 于 n 的 质 因 子 数 量 大 于 等 于 2 , 那 么 这 两 个 质 因 子 乘 积 必 然 大 于 n 。 有 了 上 面 这 个 性 质 , 我 们 每 次 枚 举 质 因 子 i , 只 需 要 循 环 到 n i 次 即 可 , 若 最 后 n > 1 , 说 明 存 在 一 个 比 n 大 的 质 因 子 , 就 是 此 时 的 “ n ” 。 由 于 每 次 枚 举 一 个 i , 会 把 n 中 的 i 因 子 除 尽 , 总 的 时 间 复 杂 度 是 介 于 O ( l o g 2 n ) − O ( n ) 之 间 的 。 由算术基本定理,任何一个大于1的自然数 N,如果N不为质数,\\那么N可以唯一分解成有限个质数的乘积N=P_1^{a_1}P_2^{a_2}P_3^{a_3}......P_n^{a_n},\\这里P_1<P_2<P_3......<P_n均为质数,其中指数a_i是正整数。\\ \ \\现给定一个正整数n,可以以小于O(\sqrt{n})的时间复杂度得到其所有的质因子及每个质因子对应的幂。\\即得到P_1,P_2,...,P_n和a_1,a_2,...,a_n。\\ \ \\同质数判定的方法类似,需要另外注意两点:\\① 、依然是i从2开始枚举每个质因子,每次枚举到一个质因子就从n中把i除尽,这样可以保证合数因子被除掉。\\ \ \\②、对任意的n,至多仅有一个大于\sqrt{n}的质因子。\\因为显然假设大于\sqrt{n}的质因子数量大于等于2,那么这两个质因子乘积必然大于n。\\ \ \\有了上面这个性质,我们每次枚举质因子i,只需要循环到\frac{n}{i}次即可,\\若最后n>1,说明存在一个比\sqrt{n}大的质因子,就是此时的“n”。\\由于每次枚举一个i,会把n中的i因子除尽,总的时间复杂度是介于O(log_2n)-O(\sqrt{n})之间的。 由算术基本定理,任何一个大于1的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1​​P2a2​​P3a3​​......Pnan​​,这里P1​<P2​<P3​......<Pn​均为质数,其中指数ai​是正整数。 现给定一个正整数n,可以以小于O(n ​)的时间复杂度得到其所有的质因子及每个质因子对应的幂。即得到P1​,P2​,...,Pn​和a1​,a2​,...,an​。 同质数判定的方法类似,需要另外注意两点:①、依然是i从2开始枚举每个质因子,每次枚举到一个质因子就从n中把i除尽,这样可以保证合数因子被除掉。 ②、对任意的n,至多仅有一个大于n ​的质因子。因为显然假设大于n ​的质因子数量大于等于2,那么这两个质因子乘积必然大于n。 有了上面这个性质,我们每次枚举质因子i,只需要循环到in​次即可,若最后n>1,说明存在一个比n ​大的质因子,就是此时的“n”。由于每次枚举一个i,会把n中的i因子除尽,总的时间复杂度是介于O(log2​n)−O(n ​)之间的。

例题:

给定n个正整数ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式
第一行包含整数n。

接下来n行,每行包含一个正整数ai。

输出格式
对于每个正整数ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。

每个正整数的质因数全部输出完毕后,输出一个空行。

数据范围
1≤n≤100,
1≤ai≤2∗109

输入样例:
2
6
8输出样例:
2 1
3 12 3

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;int n,x;
void divide(int x)
{for(int i=2;i<=x/i;i++)if(x%i==0){int cnt=0;while(x%i==0){x/=i;cnt++;}cout<<i<<" "<<cnt<<endl;}if(x>1) cout<<x<<" "<<1<<endl;cout<<endl;
}int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>x;divide(x);}return 0;
}

二、欧拉函数

对 于 正 整 数 n , 用 欧 拉 函 数 能 够 求 得 [ 1 , n − 1 ] 中 与 n 互 质 的 数 的 个 数 。 对 正 整 数 n = p 1 a 1 p 2 a 2 . . . p n a n , 欧 拉 函 数 ϕ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p n ) , 其 中 , p 1 , p 2 , . . . , p n 是 n 的 质 因 子 。 原 理 : 直 白 地 讲 , p i 是 n 的 任 意 质 因 子 , 设 [ 1 , n ] 中 , 是 p i 的 倍 数 的 数 ( p i , 2 p i , . . . ) 的 个 数 是 a i , 那 么 [ 1 , n − 1 ] 中 与 n 互 质 的 数 的 个 数 = n − ∑ a i , 而 a i = n p i , 借 助 容 斥 原 理 得 到 的 式 子 即 ϕ ( n ) 乘 积 展 开 的 式 子 。 求 正 整 数 n 的 欧 拉 函 数 , 我 们 可 以 利 用 分 解 质 因 数 的 方 法 求 得 n 的 所 有 质 因 子 , 再 代 入 公 式 即 可 。 时 间 复 杂 度 仍 然 是 小 于 O ( n ) 的 。 对于正整数n,用欧拉函数能够求得[1,n-1]中与n互质的数的个数。\\ \ \\对正整数n=p_1^{a_1}p_2^{a_2}...p_n^{a_n},欧拉函数\phi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_n}),其中,p_1,p_2,...,p_n是n的质因子。\\ \ \\原理:直白地讲,p_i是n的任意质因子,设[1,n]中,是p_i的倍数的数(p_i,2p_i,...)的个数是a_i,\\ \ \\那么[1,n-1]中与n互质的数的个数=n-\sum a_i,而a_i=\frac{n}{p_i},借助容斥原理得到的式子即\phi(n)乘积展开的式子。\\ \ \\求正整数n的欧拉函数,我们可以利用分解质因数的方法求得n的所有质因子,再代入公式即可。\\时间复杂度仍然是小于O(\sqrt{n})的。 对于正整数n,用欧拉函数能够求得[1,n−1]中与n互质的数的个数。 对正整数n=p1a1​​p2a2​​...pnan​​,欧拉函数ϕ(n)=n(1−p1​1​)(1−p2​1​)...(1−pn​1​),其中,p1​,p2​,...,pn​是n的质因子。 原理:直白地讲,pi​是n的任意质因子,设[1,n]中,是pi​的倍数的数(pi​,2pi​,...)的个数是ai​, 那么[1,n−1]中与n互质的数的个数=n−∑ai​,而ai​=pi​n​,借助容斥原理得到的式子即ϕ(n)乘积展开的式子。 求正整数n的欧拉函数,我们可以利用分解质因数的方法求得n的所有质因子,再代入公式即可。时间复杂度仍然是小于O(n ​)的。

例题:

给定n个正整数ai,请你求出每个数的欧拉函数。

输入格式
第一行包含整数n。

接下来n行,每行包含一个正整数ai。

输出格式
输出共n行,每行输出一个正整数ai的欧拉函数。

数据范围
1≤n≤100,
1≤ai≤2∗109

输入样例:
3
3
6
8
输出样例:
2
2
4

注意:

为 了 避 免 计 算 过 程 中 小 数 的 出 现 , 将 n ( 1 − 1 p i ) 转 化 为 n / p i × ( p i − 1 ) 。 为了避免计算过程中小数的出现,将n(1-\frac{1}{p_i})转化为n/p_i×(p_i-1)。 为了避免计算过程中小数的出现,将n(1−pi​1​)转化为n/pi​×(pi​−1)。


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;int n,a;int main()
{cin>>n;while(n--){cin>>a;int ans=a;for(int i=2;i<=a/i;i++){if(a%i==0){ans=ans/i*(i-1);while(a%i==0) a/=i;}}if(a>1) ans=ans/a*(a-1);cout<<ans<<endl;}return 0;
}

三、模板: Relatives POJ - 2407

题意:

给 定 正 整 数 n , 输 出 [ 1 , n − 1 ] 内 , 与 n 互 质 的 数 的 个 数 。 0 为 输 入 结 尾 。 给定正整数n,输出[1,n-1]内,与n互质的数的个数。0为输入结尾。 给定正整数n,输出[1,n−1]内,与n互质的数的个数。0为输入结尾。

Sample Input:
7
12
0Sample Output:
6
4

数据范围:

n < = 1 0 9 , T i m e l i m i t : 1000 m s , M e m o r y l i m i t : 65536 k B n<=10^9,\\Time\ limit:1000 ms,Memory\ limit:65536 kB n<=109,Time limit:1000ms,Memory limit:65536kB


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;int n;
int euler(int n)
{int res=n;for(int i=2;i<=n/i;i++){if(n%i==0){res=res/i*(i-1);while(n%i==0) n/=i;}}if(n>1) res=res/n*(n-1);return res;
}int main()
{while(~scanf("%d",&n),n)printf("%d\n",euler(n));return 0;
}

数论 - 分解质因数+欧拉函数 - Relatives POJ - 2407相关推荐

  1. 线性筛法求质数分解、欧拉函数

    普通筛法的缺点是:对于n,它的质因子有p1,p2,p3,那么n会被划掉3次. 线性筛法的核心思想是:对于n,它只被它的最小质因子p1划掉1次. 线性筛法略加变形即可用来求质数分解和欧拉函数. 求质数分 ...

  2. 数论讨伐!欧拉函数!

    [欧拉函数] 任务开始. 什么是欧拉函数?我们又怎么求呢??? 此次任务的主要怪物:欧拉函数 (1)欧拉函数定义 欧拉函数嘛,当然是我们著名的莱昂哈德·欧拉发明的啦~那么他是怎么定义介个函数滴? 咳咳 ...

  3. 陕西师范大学第七届程序设计竞赛网络同步赛 J 黑猫的小老弟【数论/法拉数列/欧拉函数】...

    链接:https://www.nowcoder.com/acm/contest/121/J 来源:牛客网 题目描述 大家知道,黑猫有很多的迷弟迷妹,当然也有相亲相爱的基友,这其中就有一些二五仔是黑猫的 ...

  4. jzoj1164-求和【欧拉函数,数论】(筛欧拉函数模板)

    正题 大意 给出一个nnn,求1∼n" role="presentation" style="position: relative;">1∼n1 ...

  5. 数论之互质与欧拉函数

    文章开始前先给大家安利我学长以前写的数论的blog:aliayc 文章目录 互质 欧拉函数 质因数分解求欧拉函数 筛法求欧拉函数 性质 积性函数 定义 性质 题目 互质 定义 ∀ a , b ∈ N ...

  6. T^TOJ - 1251 - 。◕‿◕。TMD - 欧拉函数 - 质因数分解

    http://www.fjutacm.com/Problem.jsp?pid=1251 想了很久,一开始居然还直接枚举因子d,计算重复了. 首先你要找与n的最大公因子大于m的x的个数. \[\sum\ ...

  7. Relatives POJ - 2407(不打表的欧拉函数 单求)

    Relatives POJ - 2407 题目链接:https://vjudge.net/problem/POJ-2407#author=0 题目: 给定n是一个正整数,有多少正整数小于n是n的相对素 ...

  8. POJ 2480 (约数+欧拉函数)

    题目链接: http://poj.org/problem?id=2480 题目大意:求Σgcd(i,n). 解题思路: 如果i与n互质,gcd(i,n)=1,且总和=欧拉函数phi(n). 如果i与n ...

  9. matlab狄利克雷函数,数论入门1——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛...

    数论入门1 一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数$\mu(n)$为: 当n有平方因子时,$\mu(n)=0$. 当n没有平方因子时,$\mu(n)=(-1)^{\omega(n)} ...

最新文章

  1. 如何发现优秀的IT开发人员
  2. 数据结构 — B+ 树
  3. VTK修炼之道38:图像平滑_中值滤波器
  4. 线性代数之矩阵偏导续
  5. OpenGL ES之GLSL实现仿抖音“灰度滤镜”和“颠倒滤镜”效果
  6. mysql 36条军规_mysql开发36条军规(转)
  7. 重构现有代码:Refactoring
  8. 【Azure Services Platform Step by Step-第5篇】.NET Services 概述
  9. SAP NOTE远程下载及电子证书配置
  10. HP ProLiant DL380 Gen9 升级到 ESXi 7.0 U3
  11. 3个空手套白狼的经典案例,教你如何利用商业模式疯狂赚钱
  12. 安卓外置SD卡linux,Android获取机身存储、内置SD卡与外置TF卡路径
  13. 如何购买银行理财子公司的理财产品?
  14. EMV(一):初步了解EMV和EMV的分层结构
  15. 图片文件压缩并上传至阿里云OSS
  16. Halcon的C++教程
  17. 微信小程序开发之——数据存储Storage
  18. 多方面看IP地址与常见的端口号~华山论剑
  19. Ubuntu系统桌面版安装
  20. 智能/傻瓜交换机、光纤交换机、普通交换机的区别

热门文章

  1. acwing656. 钞票和硬币
  2. 菜鸟成长记-打开PDF文件,可以左右滑动
  3. linux——ekho7.7.1(最新版)语音合成库的安装与编译
  4. BP神经网络的手写体识别 Python3
  5. 整理智能车中使用到的摄像头图像处理算法
  6. bug 回忆录(四)
  7. “爆粗口”的李想和焦虑的理想汽车:不被认可是主因,标签难摘除
  8. 开关电源学习笔记5 --- DC-DC变换器的储能电感设计之三种变换器的电感体积估算
  9. Noisy label learning
  10. 来一个阿里妈妈字体图标的简单说明书吧