给出一个正整数 aaa,要求分解成若干个正整数的乘积,即 a=a1×a2×a3×...×ana = a_1 \times a_2 \times a_3 \times ... \times a_na=a1×a2×a3×...×an,并且 1<a1≤a2≤a3≤...≤an1 < a_1 \le a_2 \le a_3 \le ... \le a_n1<a1≤a2≤a3≤...≤an,问这样的分解的方案种数有多少。注意到 a=aa = aa=a 也是一种分解。
输入格式
第 111 行是测试数据的组数 n(1≤n≤10)n(1 \le n \le 10)n(1≤n≤10),后面跟着 nnn 行输入。每组测试数据占 111 行,包括一个正整数 a(1<a<32768)a (1 < a < 32768)a(1<a<32768)。
输出格式
nnn 行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的方案种数。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
2
2
20
样例输出复制
1
4
【分析】给一个数,求它的因式分解个数(加上数本身)。
比如12 = 2 * 6 = 2 * 2 * 3 = 3 * 4 = 12;答案为4;
16 = 2 * 8 = 2 * 2 * 4 = 2 * 2 * 2 * 2 = 4 * 4 = 16;答案为5;
即F(n) = 1 + F(div1, n / div1) + 1 + F(div2, n / div2) + ... + 1 + F(divm, n / divm) 。// div 始终小与 (n / div)
其中div 为 n 的因子, F(div, n / div) 为 n / div 的因式分解个数, n / div 分解因子不得小于 div。
故递归从2开始,到 n 结束。
#include <cstdio>
int sum;
void divisor(int a, int b) {
for (int i = a; i < b; i++) {
if (b % i == 0 && i <= b / i) {
sum++;
divisor(i, b / i);
}
if (i > b / i) return;
}
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
int k;
sum = 1;
scanf("%d", &k);
divisor(2, k);
printf("%d\n", sum);
}
return 0;
}