数学知识-约数

简介: 数学知识-约数

文章目录

一、约数


289.png


二、试除法求约数

题目描述

265.png


输入样例

2

2

6

输出样例

1 2 3 6

1 2 4 8

具体实现


1. 实现思路


与试除法判断质数是相同的道理。


当 d可以整除 n 时,显然,n / d  也可以整除 n 。例如,当 n = 12  时,3 是 12的约数,4 也是 12  的约数,他们是成对存在的。


因此,在我们枚举的过程中,只需要枚举其中较小的一个即可,时间复杂度是O(n)


  • 用 vector 存储一个数的所有约数。

2. 实现代码

#include <bits/stdc++.h>
using namespace std;
vector<int> get_divisors(int x)
{
    vector<int> res;
    for (int i = 1; i <= x / i; i ++ )
    {
        if (x % i == 0)
        {
            res.push_back(i);
            //判断边界情况
            if (i != x / i)
            {
                res.push_back(x / i);
            }
        }
    }
    //对约数排序
    sort(res.begin(), res.end());
    return res;
}
int main()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int x;
        cin >> x;
        //自动对应数据类型
        auto res = get_divisors(x);
        for (auto x : res)
        {
            cout << x << ' ';
        }
        cout << endl;
    }
    return 0;
}


三、约数个数


678.png


输入样例

3

2

6

8

输出样例

12

具体实现


1. 实现思路


一个数的约数是由这个数的几个质因子相乘得到的。

例如:12 的质因子有 2,3。12 的约数有:1,2,3,4,6,12。

约数 1 是由 0 个 2, 0 个 3 相乘得到的。

约数 2 是由 1 个 2, 0 个 3 相乘得到的。

约数 3 是由 0 个 2, 1 个3 相乘得到的。

约数 4 是由 2 个 2, 0 个3 相乘得到的。

约数 6 是由 1 个 2, 1 个3 相乘得到的。

约数 12 是由 2 个 2, 1 个 3相乘得到的。


2222.png

  • 由上述公式,我们求解出每一个约数后,套用公式即可。

2. 实现代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 110, 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 p : primes)
    {
        res = res * (p.second + 1) % mod;
    }
    cout << res << endl;
    return 0;
}



四、约数之和

334.png

输入样例

3

2

6

8

输出样例

252

具体实现



1. 实现思路

  • 关于约数之和,有如下计算公式:

256.png

2. 实现代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 110, 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 p : primes)
    {
        LL a = p.first, b = p.second;
        LL t = 1;
        while (b -- )
        {
            t = (t * a + 1) % mod;
        }
        res = res * t % mod;
    }
    cout << res << endl;
    return 0;
}



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



666.png

输入样例

2

3 6

4 6

输出样例

3

2

具体实现


1. 实现思路


最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个。也称最大公因数、最大公因子,a, b 的最大公约数记为(a,b),同样的,a,b,c 的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。

如果 d 可以整除 a,同时,d 也可以整除 b,那么,d 就可以整除 ax+by。

便可以得到如下公式:(a,b)=(b,a mod b)。

代码模板如下所示:


int gcd(int a, int b)
{
    //返回a和b的最大公约数
    return b ? gcd(b, a % b) : a; 
}



2. 实现代码

#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
    //返回a和b的最大公约数
    return b ? gcd(b, a % b) : a;
}
int main()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int a, b;
        cin >> a >> b;
        cout << gcd(a, b) << endl;
    }
    return 0;
}



















































相关文章
|
3月前
|
人工智能 算法 BI
数学知识:质数与约数
数学知识:质数与约数
48 0
数学问题之(矩阵加速递推快速幂)
数学问题之(矩阵加速递推快速幂)
|
机器学习/深度学习 人工智能
数学知识-质数
数学知识-质数
|
算法 C++
数学知识:约数(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:约数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
123 0
数学知识:约数(一)
数学知识:约数(二)
AcWing 871. 约数之和
80 0
数学知识:约数(二)
|
存储 算法 图计算
数学知识:容斥原理
复习acwing算法基础课的内容,本篇为讲解数学知识:容斥原理,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
100 0
数学知识:容斥原理
|
算法
数学知识:质数(一)
复习acwing算法基础课的内容,本篇为讲解数学知识:质数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
126 0
数学知识:质数(一)
|
算法
数学知识:快速幂
复习acwing算法基础课的内容,本篇为讲解数学知识:快速幂,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
84 0
数学知识:快速幂