4
public int idealArrays(int n, int maxValue) {7
long[] inv = new long[N];8
long[] fact = new long[N];9
long[] factinv = new long[N];10
inv[1] = fact[0] = fact[1] = factinv[0] = factinv[1] = 1;11
for (int i = 2; i < N; i++) { // mod inverse12
inv[i] = M - M / i * inv[M % i] % M;13
fact[i] = fact[i - 1] * i % M;14
factinv[i] = factinv[i - 1] * inv[i] % M;16
for (int i = 1; i <= maxValue; i++) {18
Map<Integer, Integer> map = new HashMap<>();19
for (int j = 2; j * j <= tmp; j++) {20
while (tmp % j == 0) { // prime factorization.22
map.merge(j, 1, Integer::sum);26
map.merge(tmp, 1, Integer::sum);29
for (int val : map.values()) { // arranges all the primes.30
gain *= comb(n + val - 1, val, fact, factinv);40
private long comb(int a, int b, long[] fact, long[] factinv) {41
return fact[a] * factinv[b] % M * factinv[a - b] % M;