当前位置:网站首页>【4.2 约数】
【4.2 约数】
2022-07-26 22:38:00 【浪漫主义狗】
更 好 的 阅 读 体 验 \color{red}{更好的阅读体验} 更好的阅读体验
概念
- 约数,又称因数。整数 a a a除以整数 b ( b ≠ 0 ) b(b≠0) b(b=0) 除得的商正好是整数而没有余数,我们就说 a a a能被 b b b整除,或 b b b能整除 a a a。 a a a称为 b b b的倍数, b b b称为 a a a的约数。
4.2.1 试除法求约数
思想
- 从 i = 1 i=1 i=1开始枚举到 N \sqrt{N} N
- i i i和 N i \frac{N}{i} iN即为 N N N的约数
模板
const int N=1e6+3;
int res[N]; //存储约数
int cnt; //记录数量
void get_div(int n){
cnt=0; //初始化
for(int i=1;i<=n/i;i++){
//从1开始枚举
if(n%i==0){
res[cnt++]=i; //将i作为约数
if(i!=n/i) res[cnt++]=n/i; //将n/i作为约数
}
}
sort(res,res+cnt); //将约数从小到大排序
}
例题 869. 试除法求约数
描述
给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出共 n 行,其中第 i 行输出第 i 个整数 ai 的所有约数。
数据范围
1≤n≤100,
2≤ai≤2×109
输入样例:
2
6
8
输出样例:
1 2 3 6
1 2 4 8
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+3;
int res[N];
int cnt;
void get_div(int n){
cnt=0;
for(int i=1;i<=n/i;i++){
if(n%i==0){
res[cnt++]=i;
if(i!=n/i) res[cnt++]=n/i;
}
}
sort(res,res+cnt);
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
get_div(x);
for(int i=0;i<cnt;i++) cout<<res[i]<<" ";
cout<<endl;
}
return 0;
}
4.2.2 约数个数
思想
算术基本定理:任何一个大于 1 1 1的自然数 N N N,如果 N N N不为质数
那么 N N N可以唯一分解成有限个质数的乘积 N = p 1 a 1 × p 2 a 2 ⋯ × p i a k N=p_1^{a_1}\times p_2^{a_2}\dots\times p_i^{a_k} N=p1a1×p2a2⋯×piak,且最多只有一个大于 n \sqrt{n} n的质因子
这里 p 1 < p 2 < p 3 … p n p_1<p_2<p_3\dots p_n p1<p2<p3…pn均为质数,其中指数 a i a_i ai是正整数
设 d d d为 N N N的任意一个约数, d = p 1 b 1 × p 2 b 2 ⋯ × p i b j d=p_1^{b_1}\times p_2^{b_2}\dots\times p_i^{b_j} d=p1b1×p2b2⋯×pibj,其中 0 < b j < a k 0<b_j<a_k 0<bj<ak
由算术基本定理可知对于 d d d中的 p i b j p_i^{b_j} pibj项, b j b_j bj取值不同,则 d d d不同 ( 每 个 数 的 因 式 分 解 是 唯 一 的 ) (每个数的因式分解是唯一的) (每个数的因式分解是唯一的)
故 N N N的约数个数 = = = d d d的个数 = = = b j b_j bj的选法总数
{ p 1 共 有 0 ∼ a 1 种 选 法 p 2 共 有 0 ∼ a 2 种 选 法 p 3 共 有 0 ∼ a 3 种 选 法 p i 共 有 0 ∼ a k 种 选 法 \begin{cases} p_1共有0\sim a_1种选法\\ p_2共有0\sim a_2种选法\\ p_3共有0\sim a_3种选法\\ p_i共有0\sim a_k种选法\\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧p1共有0∼a1种选法p2共有0∼a2种选法p3共有0∼a3种选法pi共有0∼ak种选法
- 根据乘法原理可知: N N N的约数个数为 ( a 1 + 1 ) × ( a 2 + 1 ) × ( a 3 + 1 ) × ⋯ × ( a k + 1 ) (a_1+1)\times(a_2+1)\times(a_3+1)\times\dots\times(a_k+1) (a1+1)×(a2+1)×(a3+1)×⋯×(ak+1)
模板例题 870. 约数个数
描述
给定 n 个正整数 ai,请你输出这些数的乘积的约数个数,答案对 109+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案需对 109+7 取模。
数据范围
1≤n≤100,
1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
12
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
LL cnt=1;
map<int,int> primes; //存储质因子底数和其指数的映射
void get_div(int n){
for(int i=2;i<=n/i;i++){
//从2开始枚举质因子
if(n%i==0){
//当其为质因子时
while(n%i==0){
primes[i]++; //指数增加
n/=i;
}
}
}
if(n>1) primes[n]++; //剩余的数大于1则为最后的质因子
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
get_div(x);
}
for(auto &p : primes) cnt=cnt*(p.second+1)%mod; //核心:N的约数个数为(a1+1)*(a2+1)*(a3+1)*…*(ai+1)
cout<<cnt<<endl;
return 0;
}
4.2.3 约数之和
思想
算术基本定理:任何一个大于 1 1 1的自然数 N N N,如果 N N N不为质数
那么 N N N可以唯一分解成有限个质数的乘积 N = p 1 a 1 × p 2 a 2 ⋯ × p i a k N=p_1^{a_1}\times p_2^{a_2}\dots\times p_i^{a_k} N=p1a1×p2a2⋯×piak,且最多只有一个大于 n \sqrt{n} n的质因子
这里 p 1 < p 2 < p 3 … p i p_1<p_2<p_3\dots p_i p1<p2<p3…pi均为质数,其中指数 a k a_k ak是正整数
{ p 1 的 约 数 之 和 = p 1 0 + p 1 1 + ⋯ + p 1 a 1 p 2 的 约 数 之 和 = p 2 0 + p 2 1 + ⋯ + p 2 a 2 p 3 的 约 数 之 和 = p 3 0 + p 3 1 + ⋯ + p 3 a 3 … p i 的 约 数 之 和 = p i 0 + p i 1 + ⋯ + p i a k \begin{cases}p_1的约数之和=p_1^{0}+p_1^{1}+\dots+p_1^{a_1}\\p_2的约数之和=p_2^{0}+p_2^{1}+\dots+p_2^{a_2}\\p_3的约数之和=p_3^{0}+p_3^{1}+\dots+p_3^{a_3}\\~~~~~~~~~~~~~~~~~~~~~\dots\\ p_i的约数之和=p_i^{0}+p_i^{1}+\dots+p_i^{a_k}\\ \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧p1的约数之和=p10+p11+⋯+p1a1p2的约数之和=p20+p21+⋯+p2a2p3的约数之和=p30+p31+⋯+p3a3 …pi的约数之和=pi0+pi1+⋯+piak
根据乘法原理可知: N N N的约数之和 = ( p 1 0 + p 1 1 + ⋯ + p 1 a 1 ) × ( p 2 0 + p 2 1 + ⋯ + p 2 a 2 ) × ⋯ × ( p i 0 + p i 1 + ⋯ + p i a k ) =(p_1^{0}+p_1^{1}+\dots+p_1^{a_1})\times(p_2^{0}+p_2^{1}+\dots+p_2^{a_2})\times\dots\times(p_i^{0}+p_i^{1}+\dots+p_i^{a_k}) =(p10+p11+⋯+p1a1)×(p20+p21+⋯+p2a2)×⋯×(pi0+pi1+⋯+piak)
模板例题 871. 约数之和
描述
给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 109+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+7 取模。
数据范围
1≤n≤100,
1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
252
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
LL res=1;
map<int,int> primes; //存储质因子底数和其指数的映射
void get_div(int n){
for(int i=2;i<=n/i;i++){
//从2开始枚举质因子
if(n%i==0){
//当其为质因子时
while(n%i==0){
primes[i]++; //指数增加
n/=i;
}
}
}
if(n>1) primes[n]++; //剩余的数大于1则为最后的质因子
}
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
get_div(x);
}
for(auto &p : primes){
LL t=1;
int a=p.first,b=p.second;
while(b--){
t=(t*a+1)%mod; //核心:求出 p0一直加到p的k的次方的和
}
res=res*t%mod;
}
cout<<res<<endl;
return 0;
}
4.2.4 最大公约数和最小公倍数
概念
- 最大公约数指两个或多个整数共有约(因)数中最大的数
- 最小公倍数指两个或多个整数的公倍数里最小的数
思想
辗转相除法求最大公约数
**例如:**假如需要求 100 和18 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
100 / 18 = 5 (余 10)
18 / 10= 1(余8)
10 / 8 = 1(余2)
8 / 2 = 4 (余0)
至此,最大公约数为2
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 100 和 18 的最大公约数2。求 N N N和 M M M的最小公倍数 l c m ( N , M ) lcm(N,M) lcm(N,M),则先求 N N N和 M M M的最大公约数 g c d ( N , M ) gcd(N,M) gcd(N,M),然后 N × M g c d ( N , M ) \frac{N\times M}{gcd(N,M)} gcd(N,M)N×M则为最小公倍数。
模板
//最大公约数
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
//最小公倍数
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
边栏推荐
- 寻找真凶
- Transpose convolution correlation
- Find method of web page parsing by crawler
- Configure deeplobcut 1 with your head covered
- Reduced dimension mean dot product matrix multiplicative norm probability normal distribution square loss
- 动态联编和静态联编、以及多态
- 滑动窗口问题总结
- Codeforces d.constructing the array (priority queue)
- Blue Bridge Cup brush question notes (word analysis)
- 20220720折腾deeplabcut2
猜你喜欢

Anaconda => PyCharm => CUDA => cudnn => PyTorch 环境配置

ResNet论文解读及代码实现(pytorch)

9_ Logistic regression

SSRF (server side request forgery) -- Principle & bypass & Defense

哨兵2号(Sentinel-2)的下载及处理

c语言 static运用,灵活改变生命周期,让你写代码如鱼得水
![[LeetCode] 无重复最长字符串](/img/97/bf8c9b019136ab372ce2c43cddbb2c.jpg)
[LeetCode] 无重复最长字符串

Openharmony quick start

画冲击函数

Course notes of Professor Dalin of robotics platform
随机推荐
Matlab based medical imaging technology filtering backprojection simulation, including direct backprojection, S-L filtering, R-L filtering, LeWitt filtering
Drawing warehouse-3 (functional image)
Request attribute in crawler
Visual studio C cs0006 C failed to find metadata file
Sliding window problem summary
放图仓库-Tsai
蒙着头配置deeplabcut2
Deploy yolov5 error reporting in pycharm
CDs simulation of minimum dominating set based on MATLAB
Signal and system learning zero input response
In JS, the common writing methods and calling methods of functions - conventional writing, anonymous function writing, taking the method as an object, and adding methods to the object in the construct
5_线性回归(Linear Regression)
PTA 7-1 play with binary tree
Nacos installation and pit stepping
6_梯度下降法(Gradient Descent)
The crawler parses the object of the web page. Element name method
Openharmony quick start
Resolve Microsoft 365 and Visio conflicts
知识蒸馏——pytorch实现
8_多项式回归及模型泛化(Polynomial Regression and Model Generalization)