import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
int[] queries = new int[T];
int max_x = 0;
for (int i = 0; i < T; i++) {
queries[i] = scanner.nextInt();
if (queries[i] > max_x) {
max_x = queries[i];
}
}
int[] divisors = new int[max_x + 1];
for (int i = 1; i <= max_x; i++) {
for (int j = i; j <= max_x; j += i) {
divisors[j]++;
}
}
int[] minPrime = new int[max_x + 1];
for (int i = 2; i <= max_x; i++) {
if (minPrime[i] == 0) {
minPrime[i] = i;
if ((long) i * i <= max_x) {
for (int j = i * i; j <= max_x; j += i) {
if (minPrime[j] == 0) {
minPrime[j] = i;
}
}
}
}
}
int[] k = new int[max_x + 1];
for (int x = 2; x <= max_x; x++) {
int temp = x;
int currentK = 0;
while (temp > 1) {
int p = minPrime[temp];
int cnt = 0;
while (temp % p == 0) {
temp /= p;
cnt++;
}
currentK += cnt;
}
k[x] = currentK;
}
int[] maxVal = new int[max_x + 1];
for (int x = 2; x <= max_x; x++) {
maxVal[x] = Math.max(divisors[x], 2 * k[x]);
}
for (int q : queries) {
System.out.println(maxVal[q]);
}
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 预处理因子数目:使用筛法计算每个数的因子数目,存储在数组divisors中。
- 预处理最小质因数:使用筛法找到每个数的最小质因数,存储在数组minPrime中。
- 计算质因数指数之和:对于每个数,分解质因数并累加其所有质因数的指数,存储在数组k中。
- 计算最大权值和:对于每个数,比较其因子数目和两倍质因数指数之和,取较大者作为结果,存储在数组maxVal中,并输出结果。



京公网安备 11010502036488号