问题描述:
给定 nn个正整数 ai,请你输出这些数的乘积的约数之和,答案对 10^9+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案徐才 109+7109+7 取模。
数据范围
1≤n≤100,
1≤ai≤2×1091≤ai≤2×109
输入样例:
3
2
6
8
输出样例:
252
要看懂这题首先要看到约数个数那道题
我们设定了一个二元组,从素数映射到素数的指数
从而得到了一个结论:约数的个数等于所有素数指数加1的积
往下走我们就能明白
*对于一个目标数的约数, 它应该是这个二元组的一个组合值
比如对于72=2^3*3^2 ,它的一个约数是12
对应这这个二元组的{(2,3)(2,1)}
某一个约数一定是这个二元组的一个组合,也就是说
*约数的总和应该是这个二元组所有组合的总和
根据乘法原理可以得到
//主要看f(n)
//其实把这个式子拆开就能看到,每一个元素都是二元组的一个组合
代码:
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int mod=1e9+7;
int main(){
int n;
cin>>n;
//二元组(素数,素数的指数)
unordered_map<int,int> prime;
while(n--){
int x;
cin>>x;
for(int i=2;i<=x/i;i++){
while(x%i==0){
x/=i;
prime[i]++;
}
}
if(x>1) prime[x]++;
}
long long ans=1;
for(auto item:prime){
long long temp=1;
//这行代码很精巧,像一把锋利的小刀
for(int i=0;i<item.second;i++) temp=(temp*item.first+1)%mod;
ans=ans*temp%mod;
}
cout<<ans;
}