解题时涉及到数学的算术基本定理与隔板法
#include<iostream>
#include<vector>
using namespace std;
typedef long long LL;//自定义数据类型LL
class Solution {
private:
static constexpr int MAX_N_K_1735 = 10000;
static constexpr int MAX_Y_1735 = 13;//因为取最小的素数2时,2^13=8192,2^14=8192*2>10000,所以y最大只能是13
static constexpr LL MOD_1735 = 1000000007;
//保存组合数,组合数是从(n-1+y)个数中取出y个数,由于y、n最大取值分别为13、10000,所以(n-1+y)最大的取值是10000-1+13。整个数组初始化为0
LL Combine[MAX_N_K_1735 + MAX_Y_1735][MAX_Y_1735 + 1] = { 0 };
//对于任意大于1的正整数i,它的任意倍数j*i满足multiple_base[j*i]=i。整个数组初始化为0
int multiple_base[MAX_N_K_1735 + 1] = { 0 };
public:
//初始化multiple_base数组与组合数Combine
void init() {
//初始化multiple_base数组
int j = 1;
for (int i = 2; i <= MAX_N_K_1735; i++) {
j = 1;
while (j * i <= MAX_N_K_1735) {
if (!multiple_base[j * i]) {
multiple_base[j * i] = i;
}
j++;
}
}
//初始化组合数
Combine[0][0] = 1;
for (int i = 1; i < MAX_N_K_1735 + MAX_Y_1735; i++) {
Combine[i][0] = 1;
for (int k = 1; (k <= i) && (k <= MAX_Y_1735); k++) {
Combine[i][k] = (Combine[i - 1][k - 1] + Combine[i - 1][k]) % MOD_1735;
}
}
}
vector<int> waysToFillArray(vector<vector<int>>& queries)
{
this->init();
vector<int> ans;
int n = 0, k = 0;
int x = 0, y = 0;
int sum = 1;
for (vector<int> que : queries) {
n = que[0], k = que[1];//将k分解成由n个正整数相乘的形式
sum = 1;
while (k != 1) {
x = multiple_base[k];//k是x的倍数
y = 0;//k中包含y个x相乘(可能还包含其他的数)
while (multiple_base[k] == x) {//k还能被x整除
k /= x;
y++;
}
//被质因素x分解完成,一共有y个x
sum = (sum * Combine[n - 1 + y][y]) % MOD_1735;
}
ans.push_back(sum);
}
return ans;
}
};