1. 程式人生 > 其它 >AcWing 870. 約數個數(約數個數定理)

AcWing 870. 約數個數(約數個數定理)

技術標籤:數學演算法

本文介紹約數個數定理,一個數的約數是可以計算的。

···
參照百度百科-約數個數定理

假設:正整數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; } }