1. 程式人生 > 其它 >約數個數與約數和專題

約數個數與約數和專題

一、約數個數公式

如果\(n\)的唯一分解式: \(n={p_1}^{r_1} {p_2}^{r_2} ... {p_k}^{r_k}\)

一、\(n\)的約數個數公式:

$d(n) = (r_1+1) * (r_2+1) * ... * (r_k+1) $

證明:以\(p_1\)為例,這個質數因子,可以選擇\(0\)個,可以選擇\(1\)個,...,最多可以選擇\(r_1\)個,就是有\(r_1+1\)種選擇的可能性,其它\(p_2,p_3,...,p_k\)都是如此,根據乘法原理,所有的可能性就是\((r_1+1) * (r_2+1) * ... * (r_k+1)\)

舉個栗子:
\(180= 2^2 * 3^2 * 5\)

約數個數\(=(1+2) * (1+2) * (1+1) =18\)

二、求單個數字的約數個數

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

/**
 * 功能:計算約數個數
 * @param n
 * @return
 */
LL getDivisorCount(LL x) {
    unordered_map<int, int> primes; //key:質數 value:個數
    //求質數因子
    for (int i = 2; i <= x / i; i++)
        while (x % i == 0) x /= i, primes[i]++; //primes[i]表示質數i因子的個數+1

    //如果還有大因子,那就加上
    if (x > 1) primes[x]++;
    //公式大法
    LL res = 1;
    for (auto p : primes) res = res * (p.second + 1);//公式大法
    return res;
}

三、篩法求區間約數個數

四、約數和公式

五、求單個數字的約數和

六、篩法求區間約數和