Now how to get the sum of the divisors?
Problem in AcWing
simpler than last problem.
N = P1α1 + P2α2 + … + pNαN
So the sum = (P10 + P11 + … + P1α1) * (P20 + P21 + … + P2α2) * … * (PN0 + PN1 + … + PNαN)
Expanding = P10 * P20 * … * PN0 + …
It is worth noting
while (index-- > 0) t = (num * t + 1) % mod; //Horner Algorithm
to calculate (P10 + P11 + … + P1α1)
And the code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
static int mod = (int) (1e9 + 7);
static long sum = 1;
static Map<Long, Integer> map = new HashMap<>();
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]);
while (n-- > 0) {
s = br.readLine().split(" ");
sum = Integer.parseInt(s[0]);
for (int i = 2; i <= sum / i; i++)
while (sum % i == 0) {
map.put((long) i, map.getOrDefault((long) i, 0) + 1);
sum /= i;
}
if (sum != 1) map.put(sum, map.getOrDefault(sum, 0) + 1);
}
long res = 1;
for (Map.Entry<Long, Integer> entry : map.entrySet()) {
long num = entry.getKey(), index = entry.getValue(), t = 1;
while (index-- > 0) t = (num * t + 1) % mod;
res = res * t % mod;
}
pw.println(res % mod);
pw.flush();
br.close();
}
}