C++ 数论相关题目(约数)

这篇具有很好参考价值的文章主要介绍了C++ 数论相关题目(约数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、试除法求约数

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

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

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

输出格式
输出共 n
行,其中第 i
行输出第 i
个整数 ai
的所有约数。

数据范围
1≤n≤100
,
1≤ai≤2×109
输入样例:
2
6
8
输出样例:
1 2 3 6
主要还是可以成对的求约数进行优化,不然会超时。
时间复杂度根号n

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n;

vector<int> solve(int a)
{
    vector<int> res;
    for(int i = 1; i <= a / i; i ++ )
    {
        if(a % i == 0)
        {
            res.push_back(i);
            if(a / i != i)
                res.push_back(a / i);
        }
    }
    sort(res.begin(), res.end());

    return res;
}


int main ()
{
    cin>>n;
    while(n -- )
    {
        int a;
        cin>>a;
        auto t = solve(a);
        for(auto x : t)
            cout<<x<<' ';
        cout<<endl;
    }
    
    return 0;
}

2、约数个数

给定 n
个正整数 ai
,请你输出这些数的乘积的约数个数,答案对 109+7
取模。

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

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

输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案需对 109+7
取模。

数据范围
1≤n≤100
,
1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
12
主要是要理解算术基本定理:
C++ 数论相关题目(约数),数论,算法笔记,力扣,c++,算法
约数个数:(a1+1)(a2+2)…(an+n)
代码思想:先对每个数进行质因数分解,然后利用约数个数公式进行计算。

#include <iostream>
#include <algorithm>
#include <unordered_map>

using namespace std;

const int mod = 1e9 + 7;

int n;

int main ()
{
    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] ++;
      
    }
    long long res = 1;
    for(auto prime : primes)
        res = res * (prime.second + 1) % mod;
        
    cout << res << endl;
    
    return 0;
}

3、约数之和

给定 n
个正整数 ai
,请你输出这些数的乘积的约数个数,答案对 109+7
取模。

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

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

输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案需对 109+7
取模。

数据范围
1≤n≤100
,
1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
12
数论的题目还是主要是记公式:
C++ 数论相关题目(约数),数论,算法笔记,力扣,c++,算法

因此,这里我们先质因数分解出底数和指数,然后对每个对底数和指数求一个括号内的数,然后累乘到答案上即可。

#include <iostream>
#include <unordered_map>

using namespace std;

const int mod = 1e9 + 7;
int n;

int main ()
{
    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] ++;
    }
    
    long long res = 1;
    
    for(auto prime : primes)
    {
        long long t = 1;
        long long p = prime.first, a = prime.second;
        while(a -- )
        {
            t = (t * p + 1) % mod;
        }
        res = res * t % mod;
    }
    
    cout << res << endl;
    
    return 0;
}

4、最大公约数

给定 n
对正整数 ai,bi
,请你求出每对数的最大公约数。

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

接下来 n
行,每行包含一个整数对 ai,bi

输出格式
输出共 n
行,每行输出一个整数对的最大公约数。

数据范围
1≤n≤105
,
1≤ai,bi≤2×109
输入样例:
2
3 6
4 6
输出样例:
3

主要是记模板,a和b的最大公约数等于b和a模b的最大公约数。文章来源地址https://www.toymoban.com/news/detail-806141.html

#include <iostream>

using namespace std;

int n;

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

int main ()
{
    cin >> n;
    while(n -- )
    {
        int a, b;
        cin >> a >> b;
        cout << gcd(a, b) <<endl;
    }
    
    return 0;
}

到了这里,关于C++ 数论相关题目(约数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 入门力扣自学笔记279 C++ (题目编号:1123)

    1123. 最深叶节点的最近公共祖先 给你一个有根节点  root  的二叉树,返回它  最深的叶节点的最近公共祖先  。 回想一下: 叶节点  是二叉树中没有子节点的节点 树的根节点的  深度  为  0 ,如果某一节点的深度为  d ,那它的子节点的深度就是  d+1 如果我们假定  A

    2024年02月09日
    浏览(43)
  • 入门力扣自学笔记257 C++ (题目编号:1041)

    1041. 困于环中的机器人 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受下列三条指令之一: \\\"G\\\":直走 1 个单位 \\\"L\\\":左转 90 度 \\\"R\\\":右转 90 度

    2023年04月11日
    浏览(33)
  • 入门力扣自学笔记260 C++ (题目编号:2413)

    2413. 最小偶倍数 给你一个正整数 n ,返回 2 和 n 的最小公倍数(正整数)。 输入:n = 5 输出:10 解释:5 和 2 的最小公倍数是 10 。 输入:n = 6 输出:6 解释:6 和 2 的最小公倍数是 6 。注意数字会是它自身的倍数。 1 = n = 150 来源:力扣(LeetCode) 链接:https://leetcode.cn/probl

    2023年04月26日
    浏览(40)
  • 入门力扣自学笔记272 C++ (题目编号:2544)

    2544. 交替数字和 给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号: 最高有效位 上的数字分配到 正 号。 剩余每位上数字的符号都与其相邻数字相反。 返回所有数字及其对应符号的和。 输入:n = 521 输出:4 解释:(+5) + (-2) + (+1) = 4 输入:n = 111 输出:1 解

    2024年02月13日
    浏览(39)
  • C++算法之旅、08 基础篇 | 质数、约数

    在1的整数中,如果只包含1和本身这两个约数,就被称为质数(素数) 866. 试除法判定质数 - AcWing题库 (O(n)) 约数 d 与 n / d 成对出现 ,可以枚举较小的那一个 (O(sqrt{n})) (d = n/d \\\\ d^2 = n \\\\ d = sqrt{n}) 难点 循环判断条件不要用 sqrt,每次循环都会执行一遍sqrt函数,比较慢 循环

    2024年02月08日
    浏览(44)
  • 【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    题目链接:5. 最长回文子串 题目内容: 题目就是要我们找s中的回文子串,还要是最长的。其实想想,暴力求解也行……就是遍历所有的子串,同时判断是不是回文串,是的话再和记录的最大长度maxlen比较,如果更长就更新。时间复杂度直接变成O(n^3)。 优化的点在于,假设子

    2024年02月09日
    浏览(46)
  • C++力扣题目77--组合

    给定两个整数  n  和  k ,返回范围  [1, n]  中所有可能的  k  个数的组合。 你可以按  任何顺序  返回答案。 示例 1: 示例 2: 提示: 1 = n = 20 1 = k = n 本题是回溯法的经典题目。 直接的解法当然是使用for循环,例如示例中k为2,很容易想到 用两个for循环,这样就可以输

    2024年01月17日
    浏览(42)
  • C++力扣题目37--解数独

    力扣题目链接(opens new window) 编写一个程序,通过填充空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 \\\'.\\\' 表示。 一个数独。 答案

    2024年01月21日
    浏览(49)
  • C++力扣题目39--组合总和

    给你一个  无重复元素  的整数数组  candidates  和一个目标整数  target  ,找出  candidates  中可以使数字和为目标数  target  的 所有   不同组合  ,并以列表形式返回。你可以按  任意顺序  返回这些组合。 candidates  中的  同一个  数字可以  无限制重复被选取  。如果

    2024年01月17日
    浏览(43)
  • c++泛型算法相关笔记

    泛型算法:可以支持多种类型的算法 此处主要来讨论怎么使用标准库中定义的泛型算法 algorithm , numeric , ranges . 在引入泛型算法之前,还有一种是方法的形式,比如说 std::sort 和 std::list::sort ,前者是算法,后者是list类中定义的函数(方法) 为什么引入泛型算法,而不用方法

    2024年01月19日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包