当前位置: 首页 > news >正文

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

小蓝随手写出了含有 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 的因数中包含本身,需要减去重复的情况。
#include <iostream>
#include <vector>
#include <unordered_map>
#include <cmath>
using namespace std;

// 统计每个数的因数个数
unordered_map<int, int> countFactors(const vector<int>& nums) {
    unordered_map<int, int> factor_count;
    for (int x : nums) {
        int count = 0;
        for (int d = 1; d <= sqrt(x); d++) {
            if (x % d == 0) {
                count++;
                if (d != x / d) {
                    count++;
                }
            }
        }
        factor_count[x] = count;
    }
    return factor_count;
}

// 计算满足条件的四元组数量
int countValidQuadruples(const vector<int>& nums) {
    int n = nums.size();
    if (n < 4) return 0;

    // 统计每个数的因数个数
    unordered_map<int, int> factor_count = countFactors(nums);

    int result = 0;
    for (int k = 0; k < n; k++) {
        for (int l = 0; l < n; l++) {
            if (k == l) continue; // 确保 k 和 l 不相等
            int ak = nums[k];
            int al = nums[l];
            // 计算满足 ai 是 ak 的因数且 aj 是 al 的因数的 (ai, aj) 的数量
            int count_ai = factor_count[ak];
            int count_aj = factor_count[al];
            // 排除 ai 或 aj 等于 ak 或 al 的情况
            if (ak % ak == 0 && al % al == 0) {
                count_ai--;
                count_aj--;
            }
            result += count_ai * count_aj;
        }
    }
    return result;
}

复杂度分析:

  • 时间复杂度:
    • 预处理因数关系: O ( n ∗ m a x _ n u m ) O(n * \sqrt{max\_num}) O(nmax_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+nmax_num )
  • 空间复杂度:
    • 哈希表 factor_count 的空间复杂度为 O ( n ) O(n) O(n)

相关文章:

  • 一个前端vue3文字hover效果
  • IO多路复用
  • 模型 - QwQ-32B
  • VSCode输入npm xxx,跳转到选择应用
  • 双向选择排序算法
  • qt作业day5
  • 进程相关知识day1
  • 【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决)
  • 时间序列预测实操
  • better-sqlite3之exec方法
  • hom_mat2d_to_affine_par 的c#实现
  • django中序列化器serializer 的高级使用和需要注意的点
  • Unity中Stack<T>用法以及删除Stack<GameObject>的方法
  • WordPress开发到底是开发什么?
  • 在 Aspire 项目下使用 AgileConfig
  • Python学习第十天
  • 数据库复习(第五版)- 第六章 关系数据理论
  • 阿里云MaxCompute面试题汇总及参考答案
  • Electron-Forge + Vue3 项目初始化
  • 010---基于Verilog HDL的分频器设计
  • 如何选择邯郸网站建设/百度的链接
  • 建设企业网站官网企业网银/销售怎么找客户源
  • 网站建设市场前景如何/如何创建自己的域名
  • 手机网站怎么打开/直接进网站的浏览器
  • 现在企业需要建设网站吗/网上如何推广自己的产品
  • 毕业设计做网站怎么答辩/长沙seo优化