给定 n 个正整数 aiai,请你输出这些数的乘积的约数之和,答案对 109+7 取模。
输入格式
第一行包含整数 n。
接下来 n行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+7取模。
数据范围
1≤n≤100,
1≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
252

解释:每个括号里面就是每一个质数的任一个次幂(次幂范围 [0,αi][0,αi])之和,如果把括号拆开,就是每个括号里面选一个数乘起来,再把所有选择加起来。每个括号选一个数乘起来,不正对应每一个约数的值吗?所以约数和就是上面这个式子。
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
unordered_map<int,int>vis;
int main()
{
int n,x;
cin>>n;
while(n--)
{
cin>>x;
for(int i =2;i<=x/i;i++)
{
if(x%i==0)
{
while(x%i==0)
{
vis[i]++;
x/=i;
}
}
}
if(x!=1)vis[x]++;
}
long long ans = 1;
for(auto it = vis.begin();it!=vis.end();it++)
{
long long nowans = 1;
int prime = it->first;
int num = it->second;
for(int i = 1;i<=num;i++)
{
nowans = (nowans*prime+1)%mod;
}
ans=ans*nowans%mod;
}
cout<<ans<<endl;
return 0;
}
本文介绍了一种计算多个正整数乘积的所有约数之和的方法,并提供了一个具体的C++实现方案。该方案利用质因数分解,通过遍历输入的每个整数并累积其质因数的次数来解决此问题。
691

被折叠的 条评论
为什么被折叠?



