求一个数的约数的个数
把一个数分解完质因数
N = (a1 ^ p1) * (a2 ^p2) * (a3 ^ p3) * ……*(an ^ pn)的形式
那么从a1 ^ 0 到 a1 ^ p1都是N的约数
同理从a2 ^ 0 到 a2 ^ p2都是N的约数
…
所以约数个数(p1+1)x(p2+1)x(p3+1)x…(pn+n)
题目
给定n个正整数ai,请你输出这些数的乘积的约数个数,答案对109+7
取模。
输入格式
第一行包含整数n。
接下来n行,每行包含一个整数ai
。
输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案需对109+7
取模。
数据范围
1≤n≤100
,
1≤ai≤2∗109
输入样例:
3
2
6
8
输出样例:
12
#include <iostream>
#include <map>
using namespace std;
typedef long long LL;
int n;//输入n个数 求n个数的乘积后的约数个数
const int Mod = 1e9+7;//数太大需要取余
int main(int argc, char** argv)
{
scanf("%d",&n);
//<素数,次幂>
map<int , int> Prime;
while(n--)
{
int nNum;
scanf("%d",&nNum);
//分解成质因子乘积的形式
for(int i = 2; i <= nNum/i; i++)
{
while(0 == nNum%i)//i必定是质数
{
nNum /= i;
Prime[i]++;//记录次幂
}
}
if(nNum > 1) Prime[nNum]++;
}
LL Result = 1;
//约数个数
for(map<int,int>::iterator it = Prime.begin(); it != Prime.end(); it++)
{
pair<int,int> a = *it;
Result = Result*(a.second+1) % Mod;
}
cout<<Result<<endl;
return 0;
}