数据结构与算法学习笔记----约数

数据结构与算法学习笔记----约数

@@ author: 明月清了个风
@@ first publish time: 2024.12.30

ps⭐️主要是求约数,约数的个数,约数的和,涉及到算术基本定理的相关内容,第三题的讲解合并在第二题的思路里一起了。

Acwing 869. 试除法求约数

[原题链接](869. 试除法求约数 - AcWing题库)

给定 n n n个正整数 a i a_i ai,对于每个整数 a i a_i ai,请你按照从小到大的顺序输出它的所有约数

输入格式

第一行包含整数 n n n

接下来 n n n行,每行包含一个正整数 a i a_i ai

输出格式

输出 n n n行,其中每 i i i行输出第 i i i个整数 a i a_i ai的所有约数。

数据范围

1 ≤ n ≤ 100 1 \le n \le 100 1n100,

1 ≤ a i ≤ 2 × 1 0 9 1 \le a_i \le 2\times 10^9 1ai2×109

思路

试除法和质数中是一样的,只是我们统计的量不一样了

需要注意的就是时间复杂度了,数论中的题目需要注意时间复杂度,这关系到我们要使用什么方法解决

这题的时间复杂度是 O ( n × a ) O(n \times \sqrt{a}) O(n×a ) a a a的范围如题,因此可以得到整体时间复杂度大概在400万~500万。

代码

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>using namespace std;vector<int> get_dividers(int n)
{vector<int> res;for(int i = 1; i <= n / i; i ++){if(n % i == 0){res.push_back(i);if(i != n / i) res.push_back(n / i);}}sort(res.begin(), res.end());return res;
}int main()
{int n;cin >> n;while(n --){int x;cin >> x;vector<int> ans = get_dividers(x);for(auto t : ans) cout << t << ' ';cout << endl;}return 0;    
}

Acwing 870. 约数个数

[原题链接](870. 约数个数 - AcWing题库)

给定 n n n个正整数 a i a_i ai,请你输出这些数的乘积的约数个数,答案对 1 0 9 + 7 10^9 + 7 109+7取模。

输入格式

第一行包含整数 n n n

接下来 n n n行,每行包含一个正整数 a i a_i ai

输出格式

输出一个整数,表示所给正整数的乘积的约数个数,答案需对 1 0 9 + 7 10^9 + 7 109+7取模。

数据范围

1 ≤ n ≤ 100 1 \le n \le 100 1n100,

2 ≤ a i ≤ 2 × 1 0 9 2 \le a_i \le 2 \times 10^9 2ai2×109

思路

这里就要用到算术基本定理(这个定理的相关内容从下面的红字开始,若想跳过直接往下看蓝字)了。

算术基本定理,又称为正整数的唯一分解定理,是初等数论中一个非常重要的定理。它揭示了整数的基本性质,具体表述为:

任何一个大于1的自然数,如果不为质数,那么它可以唯一分解成有限个质数的乘积。

数学上,这可以表达为:

N = p 1 a 1 × p 2 a 2 × p 3 a 3 × ⋯ × p n a n N = p_1^{a_1} \times p_2^{a_2} \times p_3^{a_3} \times \cdots \times p_n^{a_n} N=p1a1×p2a2×p3a3××pnan

其中, p 1 < p 2 < p 3 < ⋯ < p n p_1 < p_2 < p_3 < \cdots < p_n p1<p2<p3<<pn 均为质数, a 1 , a 2 , a 3 , … , a n a_1, a_2, a_3, \ldots, a_n a1,a2,a3,,an 是正整数。这种分解称为 N N N 的标准分解式。

算术基本定理包含两个核心要点

  1. 存在性:每个大于1的自然数都可以写成质数的乘积。
  2. 唯一性:这种分解方式是唯一的,即不考虑质数的排列顺序,每个大于1的自然数只有一种质因数分解方式。

例如

  • 数字 60 60 60 可以唯一分解为 2 2 × 3 × 5 2^2 \times 3 \times 5 22×3×5
  • 数字 825 825 825 可以唯一分解为 3 × 5 2 × 11 3 \times 5^2 \times 11 3×52×11

证明方法简述

  1. 存在性证明

    • 假设存在某个大于1的自然数不能写成质数的乘积。
    • 选择所有这样的数中最小的那个,设为 n n n
    • 由于 n n n 不是质数,它可以分解为两个小于 n n n 的自然数的乘积。
    • 但这两个数都可以写成质数的乘积(因为它们都小于 n n n,且假设中不存在不能分解为质数乘积的数)。
    • 因此, n n n 也可以写成质数的乘积,与假设矛盾。
  2. 唯一性证明

    • 假设存在某个大于1的自然数可以以多于一种的方式写成质数的乘积。
    • 选择所有这样的数中最小的那个,设为 n n n
    • n n n 的两种分解式中的质数进行比较,利用反证法和欧几里得引理(若质数 p p p 能整除两数之积,则必能整除其中至少一个数)推导出矛盾。

上面是算术基本定理的相关内容,重新回到题目中,对于每个数 a i a_i ai,我们都可以进行这样的分解,那么每个数的约数的个数就可以看着所有质因数 p i a i p_i^{a_i} piai的排列组合,因此约数的个数就可以得到为 ( a 1 + 1 ) ( a 2 + 1 ) ⋯ ( a n + 1 ) (a_1 + 1)(a_2 + 1)\cdots(a_n + 1) (a1+1)(a2+1)(an+1)

这里还有个小知识点,int范围内约数个数最多的整数大概有1500个约数。

这里就直接将下一题的约数之和的算法讲了。

约数之和为 ( p 1 0 + p 1 1 + ⋯ + p 1 a 1 ) ⋯ ( p n 0 + p n 1 + ⋯ + p n a n ) ({p_1}^0+ {p_1}^1+ \cdots + {p_1}^{a_1}) \cdots ({p_n}^0+ {p_n}^1+ \cdots + {p_n}^{a_n}) (p10+p11++p1a1)(pn0+pn1++pnan),这应该也很好理解,这个多项式乘法的展开就是在每个括号中取一项乘起来,那么每个括号中的取法就有 ( a i + 1 ) (a_i + 1) (ai+1)种,所以最后一共有 ( a 1 + 1 ) ( a 2 + 1 ) ⋯ ( a n + 1 ) (a_1 + 1)(a_2 + 1)\cdots(a_n + 1) (a1+1)(a2+1)(an+1)项,即约数的个数,将这些项全部相加,即为约数之和。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <unordered_map>using namespace std;typedef long long LL;const int mod = 1e9 + 7;int main()
{int n;cin >> n;unordered_map<int, int> primes;while(n --){int x; cin >> x;for(int i = 2; i <= x / i; i ++){while(x % i == 0){x /= i;primes[i] ++;}}if(x > 1) primes[x] ++ ;}LL res = 1;for(auto prime : primes) res = res * (prime.second + 1) % mod;cout << res << endl;return 0;
}

Acwing 871. 约数之和

[原题链接](871. 约数之和 - AcWing题库)

给定 n n n个正整数 a i a_i ai,请你输出这些数的乘积的约数之和,答案对 1 0 9 + 7 10^9 + 7 109+7取模。

输入格式

第一行包含整数 n n n

接下来 n n n行,每行包含一个正整数 a i a_i ai

输出格式

输出一个整数,表示所给正整数的乘积的约数之和,答案需对 1 0 9 + 7 10^9 + 7 109+7取模。

数据范围

1 ≤ n ≤ 100 1 \le n \le 100 1n100,

2 ≤ a i ≤ 2 × 1 0 9 2 \le a_i \le 2 \times 10^9 2ai2×109

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <unordered_map>using namespace std;typedef long long LL;const int mod = 1e9 + 7;int main()
{int n;cin >> n;unordered_map<int, int> primes;while(n --){int x; cin >> x;for(int i = 2; i <= x / i; i ++){while(x % i == 0){x /= i;primes[i] ++;}}if(x > 1) primes[x] ++;}LL res = 1;for(auto prime : primes){int a = prime.first, b = prime.second;LL t = 1;while(b --) t = (t * a + 1) % mod;res = res * t % mod;}cout << res << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498386.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python编程技术

设计目的 该项目框架Scrapy可以让我们平时所学的技术整合旨在帮助学习者提高Python编程技能并熟悉基本概念&#xff1a; 1. 学习基本概念&#xff1a;介绍Python的基本概念&#xff0c;如变量、数据类型、条件语句、循环等。 2. 掌握基本编程技巧&#xff1a;教授学生如何使…

论文阅读《Cross-scale multi-instance learning for pathological image diagnosis》

From&#xff1a;2024 MIA CS-MIL GitHub&#xff1a;https://github.com/hrlblab/CS-MIL 一、Abstract&#xff1a; 在数字病理学中&#xff0c;分析高分辨率全幻灯片图像&#xff08;WSIs&#xff09;时涉及多个尺度的信息是一个重大挑战。多实例学习&#xff08;MIL&#x…

短视频平台的视频水印怎么去除?

当你看到某个短视频&#xff0c;觉得内容非常有价值&#xff0c;想要个人收藏以便日后学习或回顾&#xff0c;但发现短视频平台无法直接下载且带有水印时&#xff0c;以下提供的几种方法将帮助你轻松去除水印&#xff0c;获取高清无水印的视频内容。 方法一&#xff1a;使用第…

【Redis】Redis 典型应用 - 缓存 (cache)

目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…

解决springdoc-openapi-ui(Swagger3)跳转默认界面问题

文章目录 问题现象解决方法 问题现象 项目正确引入springdoc-openapi-ui依赖&#xff0c;但是访问/swagger-ui/index.html界面时&#xff0c;跳转到了默认的界面&#xff0c;如下图所示&#xff1a; 解决方法 1、升级maven依赖为1.8.0以上&#xff1a; <dependency>…

绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图

clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…

HALCON中用于分类的高斯混合模型create_class_gmm

目录 一、创建用于分类的高斯混合模型函数二、代码和效果展示三、相关函数 一、创建用于分类的高斯混合模型函数 create_class_gmm( : : NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed : GMMHandle)create_class_gmm创建用于分类的高斯…

lua-debug for Sublime

目标 Sublime 也支持 lua-debug&#xff0c;操作体验与 VSCode 一致。 优势 执行效率高&#xff0c;不掉帧 可随时开启 配置简单&#xff0c;一份配置兼容 VSCode 和 Sublime 安装 要求 Sublime 4 的版本&#xff08;注&#xff1a;从 Sublime 3 升到 4 的不算&#xff0c;…

Kafka消息不丢失与重复消费问题解决方案总结

1. 生产者层面 异步发送与回调处理 异步发送方式&#xff1a;生产者一般使用异步方式发送消息&#xff0c;异步发送有消息和回调接口两个参数。在回调接口的重写方法中&#xff0c;可通过异常参数判断消息发送状态。若消息发送成功&#xff0c;异常参数为null&#xff1b;若发…

leetcode 3312. 查询排序后的最大公约数

题目如下 错误示范: 暴力做法遍历nums数组分别求公约数 using namespace std; int gcd(int a,int b) {int a1 a , b1 b;if(a < b) {a1 b;b1 a;}if(a1 % b1 0) return b1;return gcd(a1 % b1,b1);}//logn vector<int> gcdValues(vector<int>& nums, …

VuePress搭建个人博客

VuePress搭建个人博客 官网地址: https://v2.vuepress.vuejs.org/zh/ 相关链接: https://theme-hope.vuejs.press/zh/get-started/ 快速上手 pnpm create vuepress vuepress-starter# 选择简体中文、pnpm等, 具体如下 .../19347d7670a-1fd8 | 69 .../19…

Junit4单元测试快速上手

文章目录 POM依赖引入业务层测试代码Web层测试代码生成测试类文件 在工作中我用的最多的单元测试框架是Junit4。通常在写DAO、Service、Web层代码的时候都会进行单元测试&#xff0c;方便后续编码&#xff0c;前端甩锅。 POM依赖引入 <dependency><groupId>org.spr…

ABB RobotStudio学习记录(二)SmartGripper模拟

SmartGripper模拟 准备具体操作 准备 名称版本Robot Studio6.08 为了简化开发&#xff0c;我研究了 ABB 机械臂 SmartGripper 在 ABB RobotStudio 中的模拟操作。 具体操作 主要分3个步骤&#xff1a; 修改机械装置&#xff0c;设置Pose; 我这里使用的ABB YuMi&#xff0c…

terminal_学习

参考&#xff1a; 让你的 Mac 提前用上 macOS Catalina 的 Shell——Oh My Zsh 配置指南 https://sspai.com/post/55176MAC 终端美化教程&#xff08;来个全套 &#xff09;https://blog.csdn.net/weixin_42326144/article/details/121957795 x.1 zsh做美化&#xff08;安装oh…

音视频入门知识(四):封装篇

⭐四、封装篇 H264封装成mp4、flv等格式&#xff0c;那为什么需要封装&#xff1f; ​ h264也能播放&#xff0c;但是按照帧率进行播放&#xff0c;可能不准 ★FLV **FLV&#xff08;Flash Video&#xff09;**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒…

使用 ASP.NET Core wwwroot 上传和存储文件

在 ASP.NET Core 应用程序中上传和存储文件是用户个人资料、产品目录等功能的常见要求。本指南将解释使用wwwroot存储图像&#xff08;可用于文件&#xff09;的过程以及如何在应用程序中处理图像上传。 步骤 1&#xff1a;设置项目环境 确保您的 ASP.NET 项目中具有必要的依…

S2-007-RCE(CVE-2012-0838)--vulhub

S2-007-RCE(CVE-2012-0838) 攻击者可以利用不安全的输入数据&#xff0c;构造OGNL表达式&#xff0c;最终导致服务器执行恶意命令。特别是在没有适当的输入验证或配置的情况下&#xff0c;攻击者可以在 HTTP 请求中嵌入 OGNL 表达式&#xff0c;触发远程代码执行。 Affected …

tar.gz压缩文件在linux上解压异常问题:gzip:stdin:invalid compressed data

1. 异常描述 将一个tar.gz压缩文件从windows拷贝到linux上之后&#xff0c;使用命令&#xff1a;tar -zxvf xxx.tar.gz压缩包时出现如下提示信息&#xff1a; 2. 异常分析 压缩包在下载的时候没有下载完整&#xff0c;重新下载一个试试。

UE5材质节点CameraDepthFade

相机深度消失&#xff0c;Fade Length相机离物体位置&#xff0c;Fade Offset消失偏移 可以让物体随着相机距离消失 相机深度消失 边缘自发光

Python机器学习笔记(十五、聚类算法的对比和评估)

用真实世界的数据集对k均值、凝聚聚类和DBSCAN算法进行比较。 1. 用真实值评估聚类 评估聚类算法对真实世界数据集的聚类结果&#xff0c;可以用调整rand指数ARI和归一化互信息NMI。 调整rand指数 &#xff08;adjusted rand index&#xff0c;ARI&#xff09;和归一化互信息…