给定 n个正整数 ai,请你输出这些数的乘积的约数之和,答案对 1e9+7取模
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对 1e9+7取模。
数据范围
1≤n≤100
1≤ai≤2×1e9
输入样例:
3
2
6
8
输出样例:
252
根据算数基本定理,一个合数可以分解成质数的乘积
形如:x = p1^a1*p2^a2.....*pk^ak;
其中,pk为x的质因子,ak为质因子的指数
则根据乘法原理,可以看出此合数的约数个数共有(a1+1)*(a2+1)....*(ak+1)
约数之和则有(p1^0+p1^1....+p1^a1)*(p2^0+p2^1....+p2^a2)....*(pk^0+pk^1...+pk^ak)
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N = 110;
typedef long long LL;
int main(void)
{
int t;cin >> t;
// 建立一个哈希表用来存储质因子的指数
unordered_map<int,int> primes;
while(t--)
{
int x;cin >> x;
for(int i=2;i<=x/i;i++)
{
// 使用试除法得出每一个质因子的指数
if(x%i==0) primes[i]++;
}
if(x>1) primes[x]++;
}
LL res= 1;
for(auto prime:primes)
{
int p = prime.first,a = prime.second;
LL t = 1;
// 当t=1时,原式=p+1;
// 当t=2时,原式=p^2+p+1;
// 这一步是为了得出括号中的每一项
while(a--) t = (t*p+1)%MOD;
// 最后将这些所有项全部乘起来
res = res*t%MOD;
}
cout << res <<endl;
return 0;
}
希望对你有所帮助!