对于一个数
其中:是的各个质因数,上式是的质因数乘积式。
约数个数:
约数之和:
约数之和
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;
int mod = 1e9+7;
int n;
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 t : primes)
{
int a = t.first;
int b =t.second;
long long k = 1;
while(b--)
k = (k*a + 1) % mod;
res = res * k % mod;
}
cout << res % mod;
return 0;
}
(1)公式推导
(2)while(b--) k = (k*a+1) % mod
这一步计算过程类似于秦九韶算法,举个例子: