给你一个二维整数数组 queries ,其中 queries[i] = [ni, ki] 。第 i 个查询 queries[i] 要求构造长度为 ni 、每个元素都是正整数的数组,且满足所有元素的乘积为 ki ,请你找出有多少种可行的方案。由于答案可能会很大,方案数需要对 109 + 7 取余 。
请你返回一个整数数组 answer,满足 answer.length == queries.length ,其中 answer[i]是第 i 个查询的结果。
示例 1:
输入:queries = [[2,6],[5,1],[73,660]]
输出:[4,1,50734910]
解释:每个查询之间彼此独立。
[2,6]:总共有 4 种方案得到长度为 2 且乘积为 6 的数组:[1,6],[2,3],[3,2],[6,1]。
[5,1]:总共有 1 种方案得到长度为 5 且乘积为 1 的数组:[1,1,1,1,1]。
[73,660]:总共有 1050734917 种方案得到长度为 73 且乘积为 660 的数组。1050734917 对 109 + 7 取余得到 50734910 。
示例 2 :
输入:queries = [[1,1],[2,2],[3,3],[4,4],[5,5]]
输出:[1,2,3,10,5]
思路:本题参考零神的解法,具体过程不再赘述了,零神解释的很清楚啦。
class Solution {
private static long[][] c;
private static int maxn = 10015;
private static int mod = 1000000007;
public int[] waysToFillArray(int[][] queries) {
init();
int m = queries.length;
int[] ans = new int[m];
for (int i = 0; i < m; i++) {
int n = queries[i][0];
int k = queries[i][1];
long sum = 1;
for (int j = 2; j * j <= k; j++) {
if (k % j == 0) {
int num = 0;
while (k % j == 0) {
num++;
k /= j;
}
sum = sum * c[n + num - 1][num] % mod;
}
}
if (k != 1)
sum = sum * n % mod;
ans[i] = (int) sum;
}
return ans;
}
private void init() {
c = new long[maxn][15];
for (int i = 0; i < maxn; i++)
c[i][0] = 1;
for (int i = 1; i < maxn; i++)
for (int j = 1; j <= i && j <= 13; j++)
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
}