// java 模板// 1、试错法求解约数staticvoidgetDiv(int n){PriorityQueue<Integer> q =newPriorityQueue<Integer>();// 优先队列,Integer已经实现了Comparable接口,可以实现自动排序int count =0;for(int i =1; i <= n/i; i++){// i 与 n/i 成对存在,能成为n的约数,那么n/i也可以是if(n % i ==0){// 满足整除条件,则为约数
q.add(i);
count++;if(i != n/i){// 如果满足条件,那么就是与之对应的另一对约数,不满足则重复了
q.add(n/i);
count++;}}}for(int i =0; i < count; i++){System.out.print(q.poll()+" ");}}// 2、约数个数求解for(int ii =0; ii < n; ii++){int x =Integer.parseInt(reader.readLine());// 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数for(int i =2; i <= x/i; i ++){while(x % i ==0){
x /= i;
map.put(i, map.getOrDefault(i,0)+1);}}if(x >1){
map.put(x, map.getOrDefault(x,0)+1);}}long res =1;for(int value : map.values()){
res = res *(value +1)%Mod;/ 此处一边相乘,一边mod,是因为一旦数字变大,就会导致溢出,影响最后的结果
}// 3、约数之和求解for(int ii =0; ii < n; ii++){int x =Integer.parseInt(reader.readLine());// 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数for(int i =2; i <= x/i; i ++){while(x % i ==0){
x /= i;
map.put(i, map.getOrDefault(i,0)+1);}}if(x >1){
map.put(x, map.getOrDefault(x,0)+1);}// map 中存储的是键值对————质因数pi与质数ailong res =1;for(int key : map.keySet()){long t =1;int value = map.get(key);while(value-->0){
t =(t * key +1)%Mod;// 进行取模运算是为了防止溢出}// 此处模仿了 p^0 + p^1 +...+p^a// t = 1;// t = p + 1;// t = p^2 + p + 1;// t = p^3 + p^2 + p + 1;
res = res*t %Mod;}// 4、最大公约数————欧几里得算法staticintgcd(int a,int b){// 用到了递归思想 + 欧几里得算法公式return b !=0?gcd(b, a % b): a;// 应该是b不等0的时候呀,满足第一个表达式,等于0满足第二个表达式}
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// C++ 模板,由yxc实现// 1、试错法求解约数
试除法求所有约数 —— 模板题 AcWing 869. 试除法求约数
vector<int>get_divisors(int x){
vector<int> res;for(int i =1; i <= x / i; i ++)if(x % i ==0){
res.push_back(i);if(i != x / i) res.push_back(x / i);}sort(res.begin(), res.end());return res;}// 2、约数个数求解 约数之和求解
约数个数和约数之和 —— 模板题 AcWing 870. 约数个数, AcWing 871. 约数之和
如果 N = p1^c1 * p2^c2 *...*pk^ck
约数个数: (c1 +1)*(c2 +1)*...*(ck +1)
约数之和: (p1^0+ p1^1+...+ p1^c1)*...*(pk^0+ pk^1+...+ pk^ck)// 3、最大公约数————欧几里得算法
欧几里得算法 —— 模板题 AcWing 872. 最大公约数
intgcd(int a,int b){return b ?gcd(b, a % b): a;}
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
三、例题题解
// java题解实现importjava.util.*;publicclassMain{staticvoidgetDiv(int n){PriorityQueue<Integer> q =newPriorityQueue<Integer>();// 优先队列,Integer已经实现了Comparable接口,可以实现自动排序int count =0;for(int i =1; i <= n/i; i++){// i 与 n/i 成对存在,能成为n的约数,那么n/i也可以是if(n % i ==0){// 满足整除条件,则为约数
q.add(i);
count++;if(i != n/i){// 如果满足条件,那么就是与之对应的另一对约数,不满足则重复了
q.add(n/i);
count++;}}}for(int i =0; i < count; i++){System.out.print(q.poll()+" ");}System.out.println();}publicstaticvoidmain(String[] args){Scanner in =newScanner(System.in);int n = in.nextInt();for(int i =0; i < n; i++){int ai = in.nextInt();getDiv(ai);}}}
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
41
importjava.util.*;importjava.io.*;publicclassMain{staticlongMod=(long)1e9+7;publicstaticvoidmain(String[] args)throwsIOException{BufferedReader reader =newBufferedReader(newInputStreamReader(System.in));HashMap<Integer,Integer> map =newHashMap<>();// 用HashMap是因为键值key是唯一的,也就意味着我们先将每个数分解成质因数和指数形式即可// 因为质因数分解和本题中的各个数之间关系都是相乘// 因此在相同key的对应的不同指数就含有了不同数相乘信息int n =Integer.parseInt(reader.readLine());for(int ii =0; ii < n; ii++){int x =Integer.parseInt(reader.readLine());// 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数for(int i =2; i <= x/i; i ++){while(x % i ==0){
x /= i;
map.put(i, map.getOrDefault(i,0)+1);}}if(x >1){
map.put(x, map.getOrDefault(x,0)+1);}}long res =1;for(int value : map.values()){
res = res *(value +1)%Mod;// 此处一边相乘,一边mod,是因为一旦数字变大,就会导致溢出,影响最后的结果}System.out.println(res);}}
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
41
42
43
importjava.util.*;importjava.io.*;publicclassMain{staticlongMod=(long)1e9+7;publicstaticvoidmain(String[] args)throwsIOException{BufferedReader reader =newBufferedReader(newInputStreamReader(System.in));HashMap<Integer,Integer> map =newHashMap<>();// 用HashMap是因为键值key是唯一的,也就意味着我们先将每个数分解成质因数和指数形式即可// 因为质因数分解和本题中的各个数之间关系都是相乘// 因此在相同key的对应的不同指数就含有了不同数相乘信息int n =Integer.parseInt(reader.readLine());for(int ii =0; ii < n; ii++){int x =Integer.parseInt(reader.readLine());// 此处使用的是分解质因数的模板,得到的每个数的质因数以及指数for(int i =2; i <= x/i; i ++){while(x % i ==0){
x /= i;
map.put(i, map.getOrDefault(i,0)+1);}}if(x >1){
map.put(x, map.getOrDefault(x,0)+1);}}// map 中存储的是键值对————质因数pi与质数ailong res =1;for(int key : map.keySet()){long t =1;int value = map.get(key);while(value-->0){
t =(t * key +1)%Mod;// 进行取模运算是为了防止溢出}// 此处模仿了 p^0 + p^1 +...+p^a// t = 1;// t = p + 1;// t = p^2 + p + 1;// t = p^3 + p^2 + p + 1;
res = res*t %Mod;}System.out.println(res);}}
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
importjava.util.*;importjava.io.*;publicclassMain{staticintgcd(int a,int b){// 用到了递归思想 + 欧几里得算法公式return b !=0?gcd(b, a % b): a;// 应该是b不等0的时候呀,满足第一个表达式,等于0满足第二个表达式}publicstaticvoidmain(String[] args)throwsIOException{BufferedReader in =newBufferedReader(newInputStreamReader(System.in));int n =Integer.parseInt(in.readLine());for(int i =0; i < n; i++){String[] str = in.readLine().split(" ");int a =Integer.parseInt(str[0]);int b =Integer.parseInt(str[1]);System.out.println(gcd(a, b));}}}