题目: AcWing 871. 约数之和
给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 109+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+7 取模。
数据范围
1≤n≤100,
1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
252
题目分析:
如果 N=p1a1∗p2a2∗…∗pkak
那么约数之和: (p10+p11+…+p1a1)∗…∗(pk0+pk1+…+pkak)
如果求每一项中所有p的和 如下代码:
while (b -- ) t = (t * a + 1) % mod;
t=t∗p+1
t=1
t=p+1
t=p2+p+1
……
t=pb+pb−1+…+1
#include <iostream>
#include <unordered_map>
using namespace std;
const int mod = 1e9+7;
int main()
{
unordered_map<int,int> primes;
int n;
cin>>n;
while(n--)
{
int a;
cin>>a;
for(int i=2;i<=a/i;i++)
{
while(a%i==0)
{
primes[i]++;
a/=i;
}
}
if(a>1)primes[a]++;
}
long long res=1;
for(auto it:primes)
{
long long mid = 1;
int p=it.first,b=it.second;
while(b--)mid=(mid*p+1)%mod;
res=res*mid%mod;
}
cout<<res<<endl;
return 0;
}