题目描述
给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 10^9+7 取模。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对 10^9+7 取模。
数据范围
1≤n≤100,
1≤ai≤2×10^9
样例
输入样例:
3
2
6
8
输出样例:
252
N = (p1 ^ x1) * (p2 ^ x2) * ……(pk ^ xk)
约数个数为(x1 + 1) * (x2 + 1) * ……(xk + 1)
约数之和为(1 + p1 + p1 ^ 2 + p1 ^ 3 …… p1 ^ x1) * (1 + p2 + p2 ^ 2…… p2 ^x2)……
先用试除法算出质因数
然后按照公式写出, 废话少说,上代码
import java.util;
class Main{
static int n;
static int mod=1000000007;
static HashMap<Integer,Integer> map=new HashMap<>();
static long res=1;//乘法要注意会不会爆int
static void getNums(int n){
for(int i=2;i<=n;i++){
while(n%i==0){
map.put(i,map.getOrDefault(i,0)+1;
n=n/i;
}
}
if(n>1) map.put(n,map.getOrDefault(n,0)+1);
}
public static void main(String[] args){
Scanner s=new Scanner(System.in);
n=s.nextInt();
while(n--!=0){
int x=s.nextInt();
getNums(x);
}
for(int p : map.keySet()){
int a=map.get(p);
long c=p;
while(a--!=1){//这个循环的目的是计算(1 + p + p^2 + ... + p^a) % mod
c=(c+1)*p%mod;
}
c=c+1;//循环结束后,因为上面的连乘和是从p开始的,需要加上1来得到1 + p + p^2 + ... +p^a
res=res*c%mod;
}
System.out.println(res);
}
}
}