前缀知识

算术基本定理

算术基本定理,又称为**正整数的唯一分解定理**,即:每个大于1的自然数,要么本身就是质数,要么可以写为2个或以上的质数的,而且这些质因子按大小排列之后,写法仅有一种方式。

例如:
$$
936=2^{3} \times 3 \times 17^{2}, 1200=2^{4} \times 3 \times 5^{2}, 5207=41 \times 127
$$

质因子相关模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

while (sc.hasNext()) {

long n = sc.nextLong();

int ans = 0;
// 任何一个数的质因子大于根号n的要么没有要么只有一个
for (int i = 2; i <= n / i; i++) {

if (n % i == 0) {
ans++;
// 设置系数
int cnt = 0;
while (n % i == 0) {
n /= i;
cnt++;
}
System.out.println("质数为" + i + "的幂次系数是" + cnt);
}

}
// // 任何一个数的质因子大于根号n的要么没有要么只有一个
if (n > 1) {
System.out.println(n + "幂次系数是" + 1);
ans++;
}

System.out.println("质因子种类个数为" + ans);
}

}

}

例题一:

问题描述

给定正整数 n, 请问有多少个质数是 n 的约数。

输入格式

输入的第一行包含一个整数 n

输出格式

输出一个整数, 表示 n 的质数约数个数。

样例输入

1
396

样例输出

1
3

样例说明

396 有 2,3,11 三个质数约数。

评测用例规模与约定

对于 30% 的评测用例, 1≤n≤10000 。

对于 60% 的评测用例, 1≤n≤10^9 。

对于所有评测用例, 1≤n≤10^16。

运行限制

  • 最大运行时间:10s
  • 最大运行内存: 512M

程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package bisai;

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

while (sc.hasNext()) {

long n = sc.nextLong();

int ans = 0;
// 任何一个数的质因子大于根号n的要么没有要么只有一个
for (int i = 2; i <= n / i; i++) {

if (n % i == 0) {
ans++;
// 设置系数
int cnt = 0;
while (n % i == 0) {
n /= i;
cnt++;
}
}
}
// // 任何一个数的质因子大于根号n的要么没有要么只有一个
if (n > 1) {

ans++;
}
System.out.println(ans);
}

}

}

例题二:

问题描述

任何一个大于 1 的正整数都能被分解为若干个质数相乘, 比如 28=2×2×728=2×2×7 被分解为了三个质数相乘。请问在区间 [2333333, 23333333] 中有多少个正整数 可以被分解为 12 个质数相乘?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

while (sc.hasNext()) {

long n = sc.nextLong();

int ans = 0;

for (int j = 2333333; j < 23333333; j++) {

int temp = j;
int num = 0;

for (int i = 2; i <= temp / i; i++) {

while (temp % i == 0) {
temp /= i;
num++;
}

}
if (temp > 1)
num++;

if (num == 12)
ans++;
}

System.out.println(ans);

}

}

}