对于一个数
其中:是的各个质因数,上式是的质因数乘积式。
约数个数:
约数之和:
step1:
采用分解质因数的方法,计算出的每一个质因数的次数
(分解质因数的blog:http://t.csdnimg.cn/HppLT)
step2:
遍历记录质因数和质因数次数的unordered_map容器primes,套用公式,得到结果
题目如下:
给定 n 个正整数 ai,请你输出这些数的乘积的约数个数,答案对 109+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案需对 109+7 取模。
数据范围
1≤n≤100
1≤ai≤2×109
解答代码如下:
#include<iostream>
#include<cstring>
#include<unordered_map>
using namespace std;
const int N = 110;
int n;
int mod = 1e9 + 7;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
unordered_map<int ,int >primes;
while(n--)
{
int x;
cin >> x;
for (int i = 2;i<=x/i;++i)
{
while(x % i == 0)
{
x = x/i;
primes[i]++;
}
}
if (x > 1)
primes[x]++;
}
long long res = 1;
for (auto i = primes.begin();i != primes.end();++i)
{
res = res*((*i).second + 1) % mod;
}
cout << res % mod;
return 0;
}
(1)公式推导
(2)本题数据的处理
本题要求中:不是要求单个数的约数个数,而是要求输出多个数乘积的约数个数
我们所采用的方法是对每一个输入的数都进行分解质因数操作,记录每个质因数的次数,最后
primes容器中的记录的各个质因数的次数就是输入的数的乘积的质因数次数,然后套用公式,
得到结果
这样的方法,与先求出所有输入的数的乘积,然后再对这个乘积使用分解质因数,接着套用公式的方法没有区别。