题目描述
给定 n 个正整数
a
i
a_i
ai,请你输出这些数的乘积的约数个数,答案对
1
0
9
+
7
10^9+7
109+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 a i a_i ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案需对
1
0
9
+
7
10^9+7
109+7取模。
数据范围
1
≤
n
≤
100
,
1
≤
a
i
≤
2
×
1
0
9
1≤n≤100, 1≤a_i≤2×10^9
1≤n≤100,1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
12
思路
本题的思路主要是通过对约数的分解,将n不断分解成一个质因子的指数乘积的形式,这样我们其实发现每个质因子的指数在不超过对应指数的情况下有a+1种取法,然后总的话就一共有(a1+1)(a2+1)……(ak+1)种搭配,所以一共就有(a1+1)(a2+1)……(ak+1)不同的约数。
代码示例
#include <iostream>
#include <unordered_map>
typedef long long LL; // long long 存储数据范围 - 9223372036854775808 ~ 9223372036854775807(20位十进制数)
using namespace std;
const int mod = 1e9 + 7;
unordered_map<int, int> primes; // 用hash来存储每个质因子的次数
void get_div(int x)
{
for(int i = 2; i <= x / i; i ++)
{
while( x % i == 0)
{
x /= i;
primes[i] ++;
}
}
if(x > 1) primes[x] ++; // 把最后一个大于1的质因子存进hash表
}
int main()
{
int n, x;
cin >> n;
while(n --)
{
cin >> x;
get_div(x);
}
LL res = 1;
for(auto prime : primes) res = res * (prime.second + 1) % mod;
cout << res << endl;
return 0;
}