AcWing 870. 約數個數(約數個數定理)
阿新 • • 發佈:2021-01-19
技術標籤:數學演算法
本文介紹約數個數定理,一個數的約數是可以計算的。
···
參照百度百科-約數個數定理
假設:正整數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;
}
}