引用题解 https://www.acwing.com/solution/content/97535/
求最长长度
在p个质因子中随便选择一个数,每次增加一个质数,最多可以增加
α1+α2+…+αk次
求序列个数
记a1,a2…at序列是我们选定的一个合法序列,那么他映射的序列就是:a1,
a2/a1, a3/a2 … at/a(t-1) 这里解释:ai/a(i-1)就是增加的倍数,即
首相为a1,后面增加的倍数为a2/a1, a3/a2 …at/a(t-1), 由于a1~at都是
质因子组成,就可以得到对于ai/a(i-1)也是一个质因子,那么对于
a1, a2/a1, a3/a2 … at/a(t-1)的组合方式就是最长序列的个数,为
(α1+α2+…+αk)!个,但是其中会有重复质因子,因此需要将重复的部分去掉
那么答案就是
import java.util.*;
public class Main {
static final int N = (int) (1 << 20) + 10;
static boolean[] st = new boolean[N];
static int[] prime = new int[N], cnt = new int[N];
static int idx;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
idx = 0;
int x = Integer.parseInt(sc.nextLine());
//分解质因数可以用线性筛法优化,避免重复计算
for (int i = 2; i <= x / i; i++) {
if (x % i == 0) {
int c = 0;
while (x % i == 0) {
c++;
x /= i;
}
prime[idx] = i;
cnt[idx++] = c;
}
}
if (x > 1) {
prime[idx] = x;
cnt[idx++] = 1;
}
int len = 0;
for (int i = 0; i < idx; i++) len += cnt[i];
System.out.print(len + " ");
long res = 1;
for (int i = 1; i <= len; i++) res *= i;
for (int i = 0; i < idx; i++)
for (int j = 1; j <= cnt[i]; j++)
res /= j;
System.out.println(res);
}
}
}