给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 10^9+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对 10^9+7 取模。
数据范围
1≤n≤100,
1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
252
/*设一个数为A,分解质因数得
A=a1^b1 * a2^b2 * a3^b3……*an^bn [a1 a2 a3 .表示不同的质因数 b1 b2 b3 表示每个质因数的次方数(即相同质因数的个数)]
A的约数的总和=(1+a1+a1^2+a1^3+a1^4+.a1^b1)*(1+a2+a2^2+a2^3+a2^4+.a2^b2).(1+an+an^2+an^3+an^4+.an^bn)
此题目求所给的正整数的乘积的约数的个数,仅需将所给的每个数进行质因数分解,将具有相同质数的质数相加,套公式即可
如2 = 2^1;
6 = 2^1*3^1;
8 = 2^3;
2*6*8 = 96 = 2^5*3*1
因此其96的约数之和为:(1+2^1+2^2+2^3+2^4+2^5)*(1+3^1) = 63*4 = 252;
*/
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int mod = 1e9+7;
int main()
{
int n;
cin>>n;
unordered_map<int,int> primes;//primes.first存的是分解出的质因数,primes.second是对应的质因数的指数
while(n--)
{
int num;
cin>>num;
for(int i=2;i<=num/i;i++)
{
while(num%i==0)
{
num/=i;
primes[i]++;
}
}
if(num>1) primes[num]++;
}
long long sum = 1;
for(auto prime:primes)
{
int p = prime.first,a = prime.second;
long long t = 1;
while(a--) t = (t*p+1)%mod; //1: t = 1,t*p+1 = p+1; 2: t = p+1,t*p+1 = p^2+p+1
sum=sum*t%mod;
}
cout<<sum<<endl;
}