一些数论性质与方法
Contents
结论
因数个数
对于一个数 $n$,它的因数个数的数量级为 $O(n^{\frac{1}{3}})$。
小于 $n$ 的质数个数
小于 $n$ 的质数个数为 $O(\frac{n}{\log n})$。
• 参考链接:这里
log换底公式
$$\log_a b = \frac{\log_c b}{\log_c a}$$
其中,$c$ 为任意正数。
证明:
设 $a = c^x, b = c^y$,有
$$\log_a b = \log_{c^x} c^y = \frac{y}{x}\log_c c = \frac{y}{x} = \frac{\log_c b}{\log_c a}$$
方法
求一个数的所有因数
先质因数分解,得到一个 map<ll, int> mp
代表每个质因数和它对应的 cnt
,然后根据质因数分类后乘在一起即可。
例如:$72=8 \times 9=2^3 \times 3^2$,那么它的所有因子应该是:
$$(1) \times (1, 2, 4, 8) \times (1, 3, 9)$$
其中,这个 $\times$ 符号代表 Cartesian Product。
• 这样就无需去重了,很方便。
代码
map<ll, int> mp; // 这里已经储存了质因数和对应的 cnt
vector<ll> get_div() {
vector<ll> res = {1};
for (auto [p, cnt] : mp) {
ll cur = 1;
vector<ll> tmp;
for (int i = 0; i <= cnt; i++) {
for (ll x : res)
tmp.push_back(x * cur);
cur *= p;
}
res = tmp;
}
sort(res.begin(), res.end());
return res;
}