質問の説明
n
正の整数 a iが与えられた場合、これらの数値の積の約数の数を出力してください。答えはモジュロ10 9 +7 です。
入力フォーマット
- 最初の行には整数が含まれています
n
。 - 次の行の
n
各行には整数 a i が含まれます。
出力フォーマット
- 指定された正の整数の積の約数を表す整数を出力します。答えは10 9 +7 を法とする必要があります。
データ範囲
- 1≤n≤100、
- 1 ≤ a i ≤ 2×10 9
基本的な考え方
- 任意の正の整数は素因数分解できます。つまり、複数の素数の積として表現できます。したがって、この問題の複数の正の整数を乗算して得られる大きな値の正の整数は、素因数の乗算として表すこともできます。この形式は、正の整数を構成する正の整数の素因数分解の結果の積になります。
k
正の整数をk
素数に分解できる場合はx
、0 <= x <= k
整数の素因数分解で考えられるすべての部分の組み合わせを乗算します。- たとえば、正の整数は
12
素因数 に因数分解できる2 × 2 × 3
ため、1
、2
、3
、2 × 2
および2 × 3
は2 × 2 × 3
すべて の12
約数になります。
コードを実装する
#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;
}