用狄利克雷前缀和卡常
August_Light · · 个人记录
符号:
在一些数论题目中,线性筛并不是时间复杂度的瓶颈,但是线性筛筛积性函数时可能会带来较大的常数。
用狄利克雷前缀和可以卡常(时间复杂度
先预先线性筛或埃氏筛筛出
// primes 是一个 vector
// 欧拉函数
for (int i = 1; i <= n; i++)
phi[i] = i;
for (auto j : primes)
for (int i = n / j; i >= 1; i--)
phi[i * j] -= phi[i];
// 莫比乌斯函数
for (int i = 1; i <= n; i++)
mu[i] = (i == 1);
for (auto j : primes)
for (int i = n / j; i >= 1; i--)
mu[i * j] -= mu[i];
// 约数个数函数
for (int i = 1; i <= n; i++)
d[i] = 1;
for (auto j : primes)
for (int i = 1; i * j <= n; i++)
d[i * j] += d[i];
前提条件:这个函数
例: