题目:给定n个正整数,请你输出这些数的乘积的约数之和,答案对109+7取模。
在解这道题之前,先引入一个公式(求一个正整数n的约数之和的公式)
$$\color{red}{若n可写成f(n)=a_1^{\alpha_1} \ast a_2^{\alpha_2} \ast \ldots\ast a_k^{\alpha_k}=\prod_{i=1}^k{(a_i^{\alpha_i})} \quad \color{brown}{(a_1,a_2, \ldots ,a_k 均为质数)}}$$
则n的约数的和(sum): $$\color{red}{sum(n)=({a_1^0+a_1^1+ \ldots + a_1^{\alpha_1}}) \ast ({a_2^0+a_2^1+ \ldots + a_2^{\alpha_2}}) \ast \ldots \ast ({a_k^0+a_k^1+ \ldots + a_k^{\alpha_k}})}$$
证明:
$$\color{blue}{已知n可写成f(n)=a_1^{\alpha_1} \ast a_2^{\alpha_2} \ast \ldots\ast a_k^{\alpha_k}=\prod_{i=1}^k{(a_i^{\alpha_i})}}$$
①算出$a_1^{\alpha_1}$的约数之和 显然=$({a_1^0+a_1^1+ \ldots + a_1^{\alpha_1}})$
①算出$a_2^{\alpha_2}$的约数之和 显然=$({a_2^0+a_2^1+ \ldots + a_2^{\alpha_2}})$
$\ldots$
end:算出$a_k^{\alpha_k}$的约数之和 显然=$({a_k^0+a_k^1+ \ldots + a_k^{\alpha_k}})$最后根据乘法原理可得:
n的约数的和(sum): $$\color{red}{sum(n)=({a_1^0+a_1^1+ \ldots + a_1^{\alpha_1}}) \ast ({a_2^0+a_2^1+ \ldots + a_2^{\alpha_2}}) \ast \ldots \ast ({a_k^0+a_k^1+ \ldots + a_k^{\alpha_k}})}$$
代码(C++)
#include<iostream>
#include<unordered_map>
const int mod = 1e9+7;
using namespace std;
long long res=1;
int main()
{
int n;
unordered_map<int,int> f;
cin>>n;
while(n--)
{
int a;
cin>>a;
for(int i=2;i<=a/i;i++)
{
if(a%i==0)
{
while(a%i==0)
{
a/=i;
f[i]++;
}
}
}
if(a>1) f[a]++;
}
for(pair<int,int> x:f)
{
long long t = 1;
int j=x.second,p=x.first;
while(j--)
{
t = (t*p+1) % mod;
}
res = res * t % mod;
}
cout<<res;
return 0;
}
?跟乘法原理有关系吗
感觉这个地方用乘法原理解释不怎么合适
嗯,应该是这些括号里各取一个数相乘可以得到一个约数,我的理解是这样
同意
推导过程挺好的