本文介绍约数个数定理,一个数的约数是可以计算的。
···
参照百度百科-约数个数定理
假设:正整数378000共有多少个正约数?
解:将378000分解质因数378000=24×33×53×71
由约数个数定理可知378000共有正约数(4+1)×(3+1)×(3+1)×(1+1)=160个。
···
练习题-Problem
简单的思路就是用哈希表存下<底数, 指数>
最后再将指数求积即可,注意每次求积都要求余,否则会移除(即使long也如此)
Accepted Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.security.KeyStore.Entry;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(System.in), 1 << 15);
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
static InputReader in = new InputReader(System.in);
static PrintWriter out = new PrintWriter(System.out);
// Input class by SoKee learned from WC:Petr and thank you
///
static final int INF = 0x3F3F3F3F;
static final int MOD_1e9plus7 = (int) (1e9 + 7);
static HashMap<Integer, Integer> map = new HashMap<>();
static int n, x;
static long res = 1;
public static void main(String[] args) {
n = in.nextInt();
for (int i = 0; i < n; i++) {
int x = in.nextInt();
bigAdd(x);
}
work();
out.println(res % MOD);
out.flush();
}
static void bigAdd(int x) {
for (int i = 2; i <= x / i; i++) {
if (x % i == 0) {
int s = 0;
while (x % i == 0) {
x /= i;
s++;
}
map.put(i, map.getOrDefault(i, 0) + s);
}
}
if (x > 1)
map.put(x, map.getOrDefault(x, 0) + 1);
}
static void work() {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
res = res * (entry.getValue() + 1) % MOD;
}
return;
}
}
277

被折叠的 条评论
为什么被折叠?



