题目 3220 ⭐因数计数⭐【数理基础】蓝桥杯2024年第十五届省赛 ...

打印 上一主题 下一主题

主题 1312|帖子 1312|积分 3936

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小蓝随手写出了含有                                    n                              n                  n 个正整数的数组                                              a                            1                                  ,                                   a                            2                                  ,                         ⋅                         ⋅                         ⋅                         ,                                   a                            n                                       {a_1, a_2, · · · , a_n}                  a1​,a2​,⋅⋅⋅,an​ ,他发现可以轻松地算出有多少个有序二元组                                    (                         i                         ,                         j                         )                              (i, j)                  (i,j) 满足                                              a                            j                                       a_j                  aj​ 是                                              a                            i                                       a_i                  ai​ 的一个因数。因此他定义一个整数对                                    (                                   x                            1                                  ,                                   y                            1                                  )                              (x_1, y_1)                  (x1​,y1​) 是一个整数对                                    (                                   x                            2                                  ,                                   y                            2                                  )                              (x_2, y_2)                  (x2​,y2​) 的“因数”当且仅当                                              x                            1                                       x_1                  x1​ 和                                              y                            1                                       y_1                  y1​ 分别是                                              x                            2                                       x_2                  x2​ 和                                              y                            2                                       y_2                  y2​的因数。他想知道有多少个有序四元组                                    (                         i                         ,                         j                         ,                         k                         ,                         l                         )                              (i, j, k, l)                  (i,j,k,l) 满足                                    (                                   a                            i                                  ,                                   a                            j                                  )                              (a_i, a_j)                  (ai​,aj​) 是                                    (                                   a                            k                                  ,                                   a                            l                                       (a_k, a_l                  (ak​,al​) 的因数,此中                                    i                         ,                         j                         ,                         k                         ,                         l                              i, j, k, l                  i,j,k,l 互不相等。
题目分析:

我们必要找到所有满足以下条件的有序四元组                                    (                         i                         ,                         j                         ,                         k                         ,                         l                         )                              (i, j, k, l)                  (i,j,k,l):


  •                                         (                                       a                               i                                      ,                                       a                               j                                      )                                  (a_i, a_j)                     (ai​,aj​) 是                                         (                                       a                               k                                      ,                                       a                               l                                      )                                  (a_k, a_l)                     (ak​,al​) 的因数,即:

    •                                                                a                                     i                                                      a_i                           ai​ 是                                                                a                                     k                                                      a_k                           ak​ 的因数。
    •                                                                a                                     j                                                      a_j                           aj​ 是                                                                a                                     l                                                      a_l                           al​ 的因数。

  •                                         i                            ,                            j                            ,                            k                            ,                            l                                  i, j, k, l                     i,j,k,l 互不相等。
办理思路:



  • 统计每个数的因数关系:

    • 对于数组中的每个数                                                   x                                          x                           x,统计有多少个数是                                                   x                                          x                           x 的因数。遍历数组,对于每个数                                                   x                                          x                           x,遍历所有大概的因数                                                   d                                          d                           d(                                                  d                                          d                           d 从 1 到                                                   s                                  q                                  r                                  t                                  (                                  x                                  )                                          sqrt(x)                           sqrt(x)),如果                                                   d                                          d                           d 是                                                   x                                          x                           x 的因数,则记录                                                   d                                          d                           d 和                                                   x                                  /                                  d                                          x/d                           x/d。
    • 使用一个哈希表或数组 factor_count 来记录每个数的因数个数。

  • 罗列四元组:

    • 对于每一对                                                   (                                               a                                     k                                              ,                                               a                                     l                                              )                                          (a_k, a_l)                           (ak​,al​),找到所有满足                                                                a                                     i                                                      a_i                           ai​ 是                                                                a                                     k                                                      a_k                           ak​ 的因数且                                                                a                                     j                                                      a_j                           aj​ 是                                                                a                                     l                                                      a_l                           al​ 的因数的                                                   (                                               a                                     i                                              ,                                               a                                     j                                              )                                          (a_i, a_j)                           (ai​,aj​)。
    • 由于                                                   i                                  ,                                  j                                  ,                                  k                                  ,                                  l                                          i, j, k, l                           i,j,k,l 必须互不相等,必要清除重复的环境。

  • 计算结果:

    • 对于每一对                                                   (                                               a                                     k                                              ,                                               a                                     l                                              )                                          (a_k, a_l)                           (ak​,al​),计算满足条件的                                                   (                                               a                                     i                                              ,                                               a                                     j                                              )                                          (a_i, a_j)                           (ai​,aj​) 的数目,并累加到结果中。
    • 如果                                                                a                                     k                                                      a_k                           ak​ 和                                                                a                                     l                                                      a_l                           al​ 的因数中包含自己,必要减去重复的环境。

  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <cmath>
  5. using namespace std;
  6. // 统计每个数的因数个数
  7. unordered_map<int, int> countFactors(const vector<int>& nums) {
  8.     unordered_map<int, int> factor_count;
  9.     for (int x : nums) {
  10.         int count = 0;
  11.         for (int d = 1; d <= sqrt(x); d++) {
  12.             if (x % d == 0) {
  13.                 count++;
  14.                 if (d != x / d) {
  15.                     count++;
  16.                 }
  17.             }
  18.         }
  19.         factor_count[x] = count;
  20.     }
  21.     return factor_count;
  22. }
  23. // 计算满足条件的四元组数量
  24. int countValidQuadruples(const vector<int>& nums) {
  25.     int n = nums.size();
  26.     if (n < 4) return 0;
  27.     // 统计每个数的因数个数
  28.     unordered_map<int, int> factor_count = countFactors(nums);
  29.     int result = 0;
  30.     for (int k = 0; k < n; k++) {
  31.         for (int l = 0; l < n; l++) {
  32.             if (k == l) continue; // 确保 k 和 l 不相等
  33.             int ak = nums[k];
  34.             int al = nums[l];
  35.             // 计算满足 ai 是 ak 的因数且 aj 是 al 的因数的 (ai, aj) 的数量
  36.             int count_ai = factor_count[ak];
  37.             int count_aj = factor_count[al];
  38.             // 排除 ai 或 aj 等于 ak 或 al 的情况
  39.             if (ak % ak == 0 && al % al == 0) {
  40.                 count_ai--;
  41.                 count_aj--;
  42.             }
  43.             result += count_ai * count_aj;
  44.         }
  45.     }
  46.     return result;
  47. }
复制代码
复杂度分析:



  • 时间复杂度:

    • 预处理因数关系:                                                  O                                  (                                  n                                  ∗                                                             m                                        a                                        x                                        _                                        n                                        u                                        m                                                           )                                          O(n * \sqrt{max\_num})                           O(n∗max_num               ​),此中                                                   n                                          n                           n 是数组长度,                                                  m                                  a                                  x                                  _                                  n                                  u                                  m                                          max\_num                           max_num 是数组中的最大值。
    • 罗列四元组:                                                  O                                  (                                               n                                     2                                              )                                          O(n^2)                           O(n2)。
    • 总时间复杂度:                                                  O                                  (                                               n                                     2                                              +                                  n                                  ∗                                                             m                                        a                                        x                                        _                                        n                                        u                                        m                                                           )                                          O(n^2 + n * \sqrt{max\_num})                           O(n2+n∗max_num               ​)。

  • 空间复杂度:

    • 哈希表 factor_count 的空间复杂度为                                                   O                                  (                                  n                                  )                                          O(n)                           O(n)。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表