#include<bits/stdc++.h>
using namespace std;
long long n;
long long a;
int prme[65005];
long long cnt=0;
long long f[65005];
void getprme() {
for(long long i=2; i*i<=45005; i++) {
if(!f[i]) {
for(long long j=i*i; j<=45005; j+=i) {
f[j]=1;
}
}
}
for(long long i=2; i<=45005; i++) {
if(!f[i]) {
prme[++cnt]=i;
}
}
}
int main(){
getprme();
memset(f,0,sizeof f);
scanf("%lld",&n);
for(int i=0;i<n;++i){
scanf("%lld",&a);
if(a==1) continue ;
for(int j=1;j<=cnt&&prme[j]<=a;++j){
while(a%prme[j]==0){
++f[j];
a/=prme[j];
}
}
if(a!=1) prme[++cnt]=a,f[cnt]=1;
}
long long ans=1;
for(int i=1;i<=cnt;++i){
if(f[i]){
long long sum=prme[i]+1;
long long k=prme[i];
for(int j=2;j<=f[i];++j){
k=(k*prme[i])%1000000007;
sum=(sum+k)%1000000007;
}
ans=(ans*sum)%1000000007;
}
}
printf("%lld",ans);
return 0;
}
调了一晚上
题目描述:
求约数之和
时间限制:1秒 内存限制:128M
题目描述
给定n个正整数ai,请你输出这些数的乘积的约数之和,答案对10^9+7取模。
输入描述
第一行包含整数n。
接下来n行,每行包含一个整数ai。
输出描述
输出一个整数,表示所给正整数的乘积的约数之和,答案需对10^9+7取模。
样例
输入
3
2
6
8
输出
252
提示
【数据范围】
1≤n≤100
1≤ai≤2∗10^9