알고리즘 검토 참고 사항 및 근사치 숫자(자세한 주석이 달린 C++ 구현)

질문 설명

  • n양의 정수 a i 가 주어지면 이 숫자의 곱의 제수를 출력하십시오. 답은 모듈로 10 9 +7입니다.

입력 형식

  • 첫 번째 줄에는 정수가 포함됩니다 n.
  • 다음 n줄의 각 줄에는 정수 a i 가 포함됩니다 .

출력 형식

  • 주어진 양의 정수의 곱의 제수를 나타내는 정수를 출력합니다. 답은 모듈 로 10 9 +7이어야 합니다.

데이터 범위

  • 1 ≤ n ≤ 100,
  • 1 ≤ ai 2×10 9

기본 아이디어

  • 모든 양의 정수는 소인수분해될 수 있습니다. 즉, 여러 소수의 곱으로 표현됩니다. 따라서 이 문제에서 여러 개의 양의 정수를 곱하여 얻은 큰 값을 갖는 양의 정수는 소인수의 곱셈으로도 표현될 수 있습니다. 이 형태는 양의 정수를 구성하는 양의 정수들의 소인수분해 결과의 곱입니다.
  • k양의 정수가 소수를 k곱한 x소수 로 분해될 수 있는 경우 0 <= x <= k정수의 소인수분해에서 가능한 모든 부분의 조합이 가능합니다.
  • 예를 들어, 양의 정수는 12소인수 로 인수분해될 수 있으므로 2 × 2 × 3, 1, 2, 32 × 2모두 인수입니다.2 × 32 × 2 × 312

코드 구현

#include <cstdio>
#include <unordered_map>
#include <cmath>
using namespace std;

// 【辅助常量定义】正整数个数的上限
const int N = 110;
// 【辅助常量定义】需要取模的值
const int MOD = 1000000007;

// 【变量定义】正整数的个数
int n;
// 【变量定义】存放所有正整数的数组
int arr[N];
// 【变量定义】记录所有正整数乘积的约数个数的变量
int result;

// 【函数定义】获取指定数组中所有正整数乘积的约数个数的函数
int get_factor_count(void)
{
    
    
    // 【变量定义】用于记录各个质因数及其指数的哈希表
    unordered_map<int, int> prime_factors;
    // 【算法第一步】对正整数数组中的每一个正整数逐一进行质因数分解
    for(int i = 0; i < n; ++ i)
    {
    
    
        // 获取当前需要进行质因数分解的正整数
        int current = arr[i];
        // 通过循环的方式,从小到大找出当前正整数的所有质因子
        for(int j = 2; j <= sqrt(current); ++ j)
        {
    
    
            // 能够整除,说明j是current的质因子
            while(current % j == 0)
            {
    
    
                // 修改current的值
                current /= j;
                // 将质因子添加到哈希表中
                if(prime_factors.count(j) != 0) ++ prime_factors[j];
                else prime_factors[j] = 1;
            }
        }
        // 判定是否有大于当前正整数的平方根的质因子
        if(current > 1)
        {
    
    
            if(prime_factors.count(current) != 0) ++ prime_factors[current];
            else prime_factors[current] = 1;
        }
    }
    // 【算法第二步】使用公式计算因数个数(取模后)
    long long temp_result = 1;
    // 通过遍历的方式,从哈希表中取出所有质因数的指数并进行计算
    for(auto it = prime_factors.begin(); it != prime_factors.end(); ++ it) temp_result = temp_result * (it -> second + 1) % MOD;
    // 最后进行取模并返回
    return temp_result;
}

int main(void)
{
    
    
    // 【变量输入】输入正整数的个数
    scanf("%d", &n);
    // 【变量输入】输入每一个正整数
    for(int i = 0; i < n; ++ i) scanf("%d", &arr[i]);
    // 【获取结果】通过自定义的函数获取所有正整数乘积的约数个数(取模10^9 + 7)
    result = get_factor_count();
    // 【结果输出】输出所有正整数乘积的约数个数
    printf("%d", result);
    return 0;
}

추천

출처blog.csdn.net/hanmo22357/article/details/142495156