每日一题之公共质因数

有N个正整数,求这N个正整数两两之间的公共质因数之和

输入: 第一行输入正整数(N<100) 第二行有N个正整数(<10000)

输出: 输出这N个正整数两两之间的公共质因数之和,结果对1000000007取模

样例输入: 4 4 6 8 9

样例输出: 11 (说明:2+2+2+2+3 4=2*2,6=2*3,8=2*2*2,9=3*3,所以4与6的公共质因数为2;4与8的公共质因数为2、2;4与9没有公共质因数,记为0。6与8的公共质因数为2、2(注意是加两个2);6与9的质因数为3。)

cpp 复制代码
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

const int MOD = 1000000007;

// 函数:返回一个数的所有质因数及其出现次数
// 输入:正整数 n
// 输出:map,其中键是质因数,值是该质因数在 n 中的出现次数
map<int, int> getPrimeFactors(int n) {
    map<int, int> factors;  // 用于存储质因数和其出现次数
    // 从 2 开始试除直到 sqrt(n)
    for (int i = 2; i * i <= n; i++) {
        // 如果 i 是 n 的因数,将 i 的次幂计入 factors,直到 n 不再能被 i 整除
        while (n % i == 0) {
            factors[i]++;
            n /= i;  // 将 n 除以 i
        }
    }
    // 如果 n 本身是一个大于 1 的质数,将其添加到 factors
    if (n > 1) factors[n]++;
    return factors;
}

// 主函数
int main() {
    int N;
    cin >> N;  // 输入正整数 N,表示有 N 个数
    vector<int> numbers(N);  // 存储这 N 个数
    
    for (int i = 0; i < N; i++) {
        cin >> numbers[i];  // 输入每个数
    }
    
    long long sum = 0;  // 用于累加所有两两之间公共质因数之和
    
    // 遍历每两个不同的数,计算其公共质因数和
    for (int i = 0; i < N; i++) {
        // 获取 numbers[i] 的质因数分解及其次数
        map<int, int> factors_i = getPrimeFactors(numbers[i]);
        for (int j = i + 1; j < N; j++) {
            // 获取 numbers[j] 的质因数分解及其次数
            map<int, int> factors_j = getPrimeFactors(numbers[j]);
            
            // 找出 factors_i 和 factors_j 的公共质因数
            for (auto& factor : factors_i) {
                int prime = factor.first;       // 质因数
                int count_i = factor.second;    // 在 numbers[i] 中的出现次数
                if (factors_j.count(prime)) {   // 如果在 factors_j 中也存在这个质因数
                    int count_j = factors_j[prime];  // 在 numbers[j] 中的出现次数
                    int min_count = min(count_i, count_j);  // 公共质因数的最小出现次数
                    // 将该公共质因数的值乘以最小出现次数,并累加到 sum 中
                    sum = (sum + (long long)prime * min_count) % MOD;
                }
            }
        }
    }
    
    // 输出结果,对 1000000007 取模的公共质因数和
    cout << sum << endl;
    return 0;
}

整体上思路就是大模拟,但是用map存储质因数和它的个数很难想到

相关推荐
EterNity_TiMe_14 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
机器学习之心25 分钟前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
yyt_cdeyyds35 分钟前
FIFO和LRU算法实现操作系统中主存管理
算法
daiyang123...1 小时前
测试岗位应该学什么
数据结构
alphaTao1 小时前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode
kitesxian1 小时前
Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)
数据结构·算法·leetcode
VertexGeek2 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz2 小时前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
jiao_mrswang3 小时前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca3 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法