AcWing 1295. X的因子链(Java)
原题链接
中等
作者:
上杉
,
2021-04-12 18:12:32
,
所有人可见
,
阅读 529
import java.util.*;
public class Main{
static int N = (1 << 20)+ 10;
static int[] primes = new int[N];//记录所有的素数
static int cnt;//素数的个数
static int[] minPrime = new int[N];//记录第i个数的最小质因数
static boolean[] flag = new boolean[N];//记录第i个数有没有被筛选过
static long[] fact = new long[21];//最多算到20的阶乘
public static void main(String[] args){
getPrimes(N - 1);
getFact(20);
// System.out.println(Arrays.toString(fact));
Scanner input = new Scanner(System.in);
while(input.hasNextInt()){
int x = input.nextInt();
//求出x的所有质因数、
HashMap<Integer,Integer> map = new HashMap<>();//用来存放X的每个质因数以及他的个数
int len = 0;
while(x > 1){
len++;
int prime = minPrime[x];//x当前的质因数
Integer count = map.get(prime);
if(count == null){
map.put(prime,1);
}else{
map.put(prime,count+1);
}
x/= prime;
}
//len 即为最大长度,即所有质因子的个数和
// System.out.println(len);
//计算质因子排列的个数
long res = fact[len];
for(int prime: map.keySet()){
//prime map.get(prime)
int count = map.get(prime);
res /= fact[count];
}
System.out.println(len+" "+ res);
}
}
public static void getPrimes(int n){
for(int i = 2 ; i <= n ; i++){
if(!flag[i]){
//第i个数是质数
primes[cnt++] = i;
minPrime[i] = i;
}
for(int j = 0 ; primes[j] * i <= n ; j++){
flag[primes[j] * i] = true;
minPrime[primes[j] * i] = primes[j];
if(i % primes[j] == 0) break;
}
}
}
public static void getFact(int n){
fact[1] = 1;
for(int i = 2 ; i <= n ; i++){
fact[i] = fact[i-1] * i;
}
}
}