爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【C++数轮】数论、质数、最大公约数、菲蜀定理

      首页 知识中心 软件开发 文章详情页

      【C++数轮】数论、质数、最大公约数、菲蜀定理

      2025-03-10 09:50:26 阅读次数:10

      times,最大公约数,质数

      前言

      C++算法与数据结构
      打开打包代码的方法兼述单元测试

      数学

      唯一分解定理

      n>=2都可以表示为质因数的乘方。
      令 n = a1b1a2b2 … \dots …
      a1,b1 … \dots …都是质因数,b1,b2 … \dots …是对应质因数的数量。

      下面是封装类:结果存放在vector m_a, m_n

      class CUniqueFactorization
      {
      public:
      	CUniqueFactorization(int iMax) {
      		int iMaxSqrt = sqrt(iMax) + 2;
      		m_vPrime = CreatePrime(iMaxSqrt);
      	}
      	void Factorization(int x) {
      		m_a.clear();
      		m_n.clear();
      		for (const auto& iPre : m_vPrime) {
      			int cnt = 0;
      			while (0 == x % iPre) {
      				cnt++;
      				x /= iPre;
      			}
      			if (cnt > 0) {
      				m_a.emplace_back(iPre);
      				m_n.emplace_back(cnt);
      			}
      		}
      		if (x > 1) {
      			m_a.emplace_back(x);
      			m_n.emplace_back(1);
      		}
      	}
      	vector<int> m_a, m_n;
      	vector<int> CreatePrimeOld(int iMax)
      	{
      		vector<int> vNo(iMax + 1);
      		vector<int> vPrime;
      		for (int i = 2; i <= iMax; i++)
      		{
      			if (!vNo[i])
      			{
      				vPrime.emplace_back(i);
      			}
      			for (const auto& n : vPrime)
      			{
      				if (n * i > iMax)
      				{
      					break;
      				}
      				vNo[n * i] = true;
      			}
      		}
      		return vPrime;
      	}
      	vector<int> CreatePrime(int iMax)
      	{
      		vector<bool> isPrime(iMax + 1, true);
      		vector<int> vPrime;
      		for (int i = 2; i <= iMax; i++)
      		{
      			if (isPrime[i])
      			{
      				vPrime.emplace_back(i);
      			}
      			for (const auto& n : vPrime)
      			{
      				if (n * i > iMax) { break; }
      				isPrime[n * i] = false;
      				if (0 == i % n) { break; }
      			}
      		}
      		return vPrime;
      	}
      	vector<int> m_vPrime;
      };
      

      调和级数

      1+1/2 + 1/3 +1/4 ⋯ \cdots ⋯ 1/ n 约等于 logn。
      证明过程:
      1/3 + 1/4 < (1/2) × \times × 2 = 1
      1/5 + 1/6 + 1/7 + 1/8 < (1/4) × \times × 4 = 1
      1/9+1/10+…1/16 < (1/8) × \times × 8 = 1
      ⋮ \vdots ⋮
      1/2^(m-1)+ ⋯ \cdots ⋯+ 1/2m < 1

      区间公约数

      n个数,那些数对非互质。两两枚举,时间复杂度是O(nn)。
      令这些数最大值为m,枚举那些数是x$\in[2,m]的倍数,则时间复杂度是O(nlogn)。
      一,相同值如果大于1,非互质。
      二,如果同时x>1的倍数,非互质。
      转化成并集查找计算连通区域,注意:两个连通区域合并,只需要从2个联通区域任取一点相连。

      质数

      质数分解

      x的质因数中最多有一个大于 x \sqrt x x ​。反证法:如果有两个质因数大于 x \sqrt x x ​,则它们相乘大于 x × x \sqrt x \times \sqrt x x ​×x ​,和所有质因数相乘等于x矛盾。
      小于等于x的质因数可以直接枚举。如何寻找大于 x \sqrt x x ​的质因数?
      x 如果包括小于等于 x \sqrt x x ​的质因数x1,则x ÷ \div ÷=x1。直到不包括小于等于 x \sqrt x x ​的质因数。如果此时x>1,则此时的x也是质因数。

      for (int i = 0; i < nums.size(); i++) {
      			int tmp = nums[i];
      			for (auto& iPri : vPrime) {
      				if (iPri * iPri > tmp) { break; }
      				if (0 == tmp % iPri) { indexs[iPri].emplace_back(i); }
      				while ((0 == tmp % iPri)) {
      					tmp /= iPri;
      				}
      			}
      			if( tmp > 1){ indexs[tmp].emplace_back(i); }
      		}
      

      埃氏筛

      如何寻找[1,m]所有质数。从2其,如果i是质数,则将i的x倍(x>1)标记位非质数。时间复杂度:O(nlogn),logn是调和级数的和。

      vector<int> CreatePrime(int iMax)
      {
      	vector<int> vNo(iMax + 1);
      	vector<int> vPrime;
      	for (int i = 2; i <= iMax; i++)
      	{		
      		if (!vNo[i])
      		{
      			vPrime.emplace_back(i);
      		}
      		for (const auto& n : vPrime)
      		{
      			if( n * i > iMax )
      			{
      				break;
      			}
      			vNo[n * i] = true;
      		}		
      	}
      	return vPrime;
      }
      

      欧拉筛(线性筛)

      埃氏筛枚举了所有a × \times ×b,其中a是质数,b是任意数。
      欧拉筛增加了新条件:a <= b的最小质因数,也就a 是 a × \times ×b 的最小质因数。因为任意数的最小质因数都只有一个,故不会重复。故时间复杂度:O(n)
      以12为例:
      埃氏筛枚举了2次,2 × \times × 6 ,3 × \times × 4。
      欧拉筛:只枚举了 2 × \times × 6 。4 枚举完2后,就结束了。
      【C++数轮】数论、质数、最大公约数、菲蜀定理

      代码

      vector<int> CreatePrime(int iMax)
      {
      	vector<bool> isPrime(iMax + 1,true);
      	vector<int> vPrime;
      	for (int i = 2; i <= iMax; i++)
      	{
      		if (isPrime[i])
      		{
      			vPrime.emplace_back(i);
      		}
      		for (const auto& n : vPrime)
      		{
      			if (n * i > iMax){break;}
      			isPrime[n * i] = false;
      			if (0 == i % n) { break; }
      		}
      	}
      	return vPrime;
      }
      

      最大公约数

      gcc,vc都有gcd函数,可以直接使用。

      辗转相减法

      求a,b的最大公约数。如果a,b相等,则a就是公约数。下面只讨论两者不等。
      不失一般性,令a > b,其最大公约数为q。a = a1q,b=b1q ,令a - b =(a1-b1)q =c1q= c。则q也是(c,b)的公约数。
      我们用反证法来证明c,b没有大于q的公约数。假定c,b有大于q的公约数q1,则a = (b2+c2)q2 ,b = b2q2。a,b也有公约数q2,和a,b的最大公约数是q矛盾。
      不断持续此过程,可以保持公约数不变的情况下,让max(a,b)变小。由于a>b,故c >= q。经过有限回合,c一定变成q,b变成q后,a每次也减少q,直到a也变成q。

      辗转相除法(欧几里得)求最大公约数

      ( a , b ) → 不失一般性,令 a > = b ( c = a m o d    b , d = b ) → 不失一般性,令 c > = d ( e = c m o d    d , f = d ) ⋯ (a,b)^{不失一般性,令a >= b}_\rightarrow (c= a \mod b,d= b) ^{不失一般性,令c >= d}_\rightarrow (e=c \mod d,f=d) \cdots (a,b)→不失一般性,令a>=b​(c=amodb,d=b)→不失一般性,令c>=d​(e=cmodd,f=d)⋯
      直到最后的两个数一个为0,则公约数是另外一个。比如:e为0,最大公约数就是f。f为0,最大公约数为e。
      a,b不断变小,有限次数一定有一个数变为0。
      令某两个数的最大公约数为q, 则这两个数可以表示为 q × a , q × b 则 q × ( a m o d    b ) , q × b 的最大公约数为 q 则这两个数可以表示为q \times a,q \times b 则 q \times (a \mod b) , q \times b 的最大公约数为q 则这两个数可以表示为q×a,q×b则q×(amodb),q×b的最大公约数为q
      a%b 为0,也符合数学定义: 0和任何数x的最大公约数是x。

      二进制求公约数

      求a,b的最大公约数。
      一,如果a,b都是偶数,则GCD(a,b) = 2*GCD(a,b)。
      二,如果a 是偶数,b是奇数(反之类似)。GCD(a,b)=GCD(a/2,b)。b是奇数,所以他们的公约数不包括2。
      三,两者都是奇数。
      3.1,两者相等。a就是最大公约数。
      3.2,a b不等,不失一般性,令a>b。GCD(a,b) == GCD(a+b,b) == GCD((a+b)/2,b)
      由于a,b是不断变小,一定会相等。

      菲蜀定理

      【数学归纳法 反证法】菲蜀定理

      题解2024年11月9整理

      余数 难度分
      【C++ 前缀和 数论】1590. 使数组和能被 P 整除 2038
      【C++数论】2029. 石子游戏 IX 2277
      质数判断、分解 难度分
      【C++前缀和 数论 贪心】2245. 转角路径的乘积中最多能有几个尾随零 2036
      【单调栈】LeetCode:2818操作使得分最大 2396
      【状态机dp 状态压缩 分组】1994. 好子集的数目 2464
      【分解质因数 差分数组】2584. 分割数组使乘积互质 2519
      最大公约数 难度分
      【栈 最小公倍数 最大公约数】2197. 替换数组中的非互质数 2057
      【最大公约数 排序】2344. 使数组可以被整除的最少删除次数 1640
      【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和 2072
      【二进制求公约数】【数学】【数论】2543. 判断一个点是否可以到达 2220
      【最大公约数】2862. 完全子集的最大元素和 2291
      区间最大公约数:调和级数o(nlogn) 难度分
      【最大公约 调和奇数 并集查找】2709. 最大公约数遍历 2171
      【调和级数 并集查找】1627. 带阈值的图连通性 2221
      【最大公约数 调和级数】2183.统计可以被 K 整除的下标对数目 2246
      【并集查找 最大公约数 调和数】952. 按公因数计算最大组件大小 2272
      【数论 最大公约数 调和数】【最大公约数】1819. 序列中不同最大公约数的数目 2539
      菲蜀定理 难度分
      【菲蜀定理 子序列】1250 检查「好数组」 1983

      |唯一分解定理|难度分|

      【唯一分解定理 数学】1808好因子的最大数目 2070
      【唯一分解定理】【动态规划】【前缀和】1735生成乘积数组的方案数 2499
      类似区间公约数 难度分
      【动态规划】【前缀和】【分组】2338. 统计理想数组的数目 2615
      其它 难度分
      【数位dp】【数论】【动态规划】2999. 统计强大整数的数目 2351
      【数论 状态机dp】2572. 无平方子集计数 2419
      【数论 排序 滑动窗口】1040. 移动石子直到连续 II 2455
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/he_zhidan/article/details/138058494,作者:闻缺陷则喜何志丹,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Java 数据结构与算法之红黑树详解

      下一篇:【python】python一些热点问题

      相关文章

      2025-05-09 08:50:42

      oralce逗号分割变多行

      oralce逗号分割变多行

      2025-05-09 08:50:42
      split , str , times
      2025-05-08 09:04:15

      质数的最大距离。

      用go语言,给定一个整数数组 nums,请找出两个(可以是相同的)质数在该数组中的下标之间的最大距离。

      2025-05-08 09:04:15
      nums , 下标 , 数组 , 质数 , 距离
      2025-04-01 10:28:48

      手撕代码:最小公倍数,复杂度多少?

      手撕代码:最小公倍数,复杂度多少?

      2025-04-01 10:28:48
      时间复杂度 , 最大公约数 , 算法
      2025-03-25 08:00:34

      【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目

      【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目

      2025-03-25 08:00:34
      amp , count , edges , 节点 , 质数 , 路径
      2025-03-21 06:59:41

      【C++数论 筛选质数】2523. 范围内最接近的两个质数|1649

      【C++数论 筛选质数】2523. 范围内最接近的两个质数|1649

      2025-03-21 06:59:41
      left , lt , right , 质数
      2025-03-06 09:16:11

      C语言刷题 | 判断是否素数(9)

      C语言刷题 | 判断是否素数(9)

      2025-03-06 09:16:11
      number , 循环 , 整数 , 素数 , 质数
      2025-03-03 09:46:26

      P1029 最大公约数和最小公倍数问题(C++_数论)

      P1029 最大公约数和最小公倍数问题(C++_数论)

      2025-03-03 09:46:26
      个数 , 公倍数 , 最大公约数 , 正整数 , 输入 , 输出
      2025-03-03 09:46:14

      信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1099:第n小的质数

      信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1099:第n小的质数

      2025-03-03 09:46:14
      样例 , 正整数 , 质数 , 输入 , 输出 , 限制
      2025-03-03 09:46:14

      信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1098:质因数分解

      信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1098:质因数分解

      2025-03-03 09:46:14
      一行 , 包含 , 样例 , 正整数 , 质数 , 输入 , 输出
      2025-02-27 09:33:07

      【C++堆(优先队列)】1942. 最小未被占据椅子的编号|1695

      【C++堆(优先队列)】1942. 最小未被占据椅子的编号|1695

      2025-02-27 09:33:07
      times
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5243932

      查看更多

      最新文章

      质数的最大距离。

      2025-05-08 09:04:15

      手撕代码:最小公倍数,复杂度多少?

      2025-04-01 10:28:48

      【C++数论 筛选质数】2523. 范围内最接近的两个质数|1649

      2025-03-21 06:59:41

      C语言刷题 | 判断是否素数(9)

      2025-03-06 09:16:11

      P1029 最大公约数和最小公倍数问题(C++_数论)

      2025-03-03 09:46:26

      信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1099:第n小的质数

      2025-03-03 09:46:14

      查看更多

      热门文章

      C++ 判断某一个数是否为质数

      2023-02-16 09:40:03

      Python|利用BFS模板解决水壶问题

      2023-02-24 08:29:11

      C语言求最大公约数和最小公倍数

      2024-11-13 09:08:40

      用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c 并且一定有:1 <= a <= b <= c <= 10^9

      2025-01-15 08:09:24

      C++背包问题

      2025-02-18 07:30:03

      【C++ 数论 质数判断】866. 回文质数|1938

      2025-02-17 09:48:47

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c 并且一定有:1 <= a <= b <= c <= 10^9

      信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1099:第n小的质数

      【C++堆(优先队列)】1942. 最小未被占据椅子的编号|1695

      【C++数论 筛选质数】2523. 范围内最接近的两个质数|1649

      P1029 最大公约数和最小公倍数问题(C++_数论)

      【C++差分数组】P3655不成熟的梦想家

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号