前置技能点:
整除分块:
现在我们想求:
∑i=1n⌊ni⌋
\sum_{i=1}^n {\lfloor\frac{n}{i}\rfloor}
i=1∑n⌊in⌋
不妨先考虑 ⌊ni⌋\lfloor \frac n i\rfloor⌊in⌋的结果.
{i≤n,i只有n种可能,所以⌊ni⌋也只有n种可能i>n,虽然i有n−n种可能,但是⌊ni⌋≤n所以⌊ni⌋也只有n中可能
\begin{cases} i \leq \sqrt{n},i只有\sqrt{n}种可能,所以\lfloor \frac n i \rfloor 也只有 \sqrt n 种可能
\\i \gt \sqrt n ,虽然i有 n-\sqrt n种可能,但是\lfloor \frac n i \rfloor \le \sqrt n 所以\lfloor \frac n i \rfloor也只有\sqrt n 中可能
\end{cases}
{i≤n,i只有n种可能,所以⌊in⌋也只有n种可能i>n,虽然i有n−n种可能,但是⌊in⌋≤n所以⌊in⌋也只有n中可能
既然如此,我们不妨根据 ⌊ni⌋\lfloor \frac n i \rfloor⌊in⌋ 分块,然后每一块统一计算大小,这样我们在O(n)O\left ( \sqrt n \right )O(n) 的复杂度下求解了.
积性函数:
积性函数f(x)满足:任何x,y,如果gcd(x,y)=1,则f(xy)=f(x)f(y)积性函数f(x)满足: 任何x,y,如果 gcd(x,y) =1,则 f( xy) = f(x)f(y) 积性函数f(x)满足:任何x,y,如果gcd(x,y)=1,则f(xy)=f(x)f(y)
性质:
如果f(x),g(x)为积性函数,p为常数,则:如果f(x),g(x)为积性函数,p为常数,则:如果f(x),g(x)为积性函数,p为常数,则:
h(x)=fp(x)h(x)=f(xp)h(x)=f(x)g(x)h(x)=∑d∣xf(d)g(xd)
\begin{aligned}
h(x) &= f^p(x)\\
h(x) &= f(x^p)\\
h(x) &= f(x)g(x)\\
h(x) &= \sum_{d|x} f(d)g(\frac x d)
\end{aligned}
h(x)h(x)h(x)h(x)=fp(x)=f(xp)=f(x)g(x)=d∣x∑f(d)g(dx)
h(x)均为积性函数h(x)均为积性函数h(x)均为积性函数
常见的几个积性函数:
单数函数:ϵ(n)=[n==1];恒等函数:id(n)=n;常数函数:1(n)=1;除数函数:σk(n)=∑d∣ndk;如果k=0,可简写为d(n)欧拉函数:ϕ(n)=∑i=1n[gcd(i,j)==1];莫比乌斯函数:u(n)={1n=1(−1)kk为n的不同素因子个数,且每个素因子只拥有一个0otherwise \begin{aligned} 单数函数: \epsilon (n) &= [n==1];\\ 恒等函数: id(n) &= n;\\ 常数函数 :1(n) &= 1;\\ 除数函数: \sigma_{k}(n) &= \sum_{d|n} d^k;如果k=0,可简写为d(n)\\ 欧拉函数: \phi(n) &= \sum_{i=1}^n [gcd(i,j)==1];\\ 莫比乌斯函数:u(n) &= \begin{cases} 1 & n=1\\ (-1)^k & k为n的不同素因子个数,且每个素因子只拥有一个\\ 0 & otherwise\\ \end{cases} \end{aligned} 单数函数:ϵ(n)恒等函数:id(n)常数函数:1(n)除数函数:σk(n)欧拉函数:ϕ(n)莫比乌斯函数:u(n)=[n==1];=n;=1;=d∣n∑dk;如果k=0,可简写为d(n)=i=1∑n[gcd(i,j)==1];=⎩⎪⎨⎪⎧1(−1)k0n=1k为n的不同素因子个数,且每个素因子只拥有一个otherwise
Dirichlet卷积:
对于数论函数f(x),g(x):对于数论函数f(x),g(x):对于数论函数f(x),g(x):
(f∗g)n=∑d∣nf(d)g(⌊nd⌋)
(f*g)_{n} = \sum_{d|n} f(d)g(\lfloor \frac n d \rfloor)
(f∗g)n=d∣n∑f(d)g(⌊dn⌋)
卷积满足交换律,结合律.卷积满足交换律,结合律.卷积满足交换律,结合律.
举例:
ϵ=u∗1d=1∗1σ=id∗1ϕ=id∗u \begin{aligned} \epsilon &=u * 1\\ d &= 1 * 1\\ \sigma &= id * 1\\ \phi &= id * u \end{aligned} ϵdσϕ=u∗1=1∗1=id∗1=id∗u
莫比乌斯函数:
u(n)={1n=1(−1)kk为n的不同素因子个数,且每个素因子只拥有一个0otherwise u(n) = \begin{cases} 1 & n=1\\ (-1)^k & k为n的不同素因子个数,且每个素因子只拥有一个\\ 0 & otherwise\\ \end{cases} u(n)=⎩⎪⎨⎪⎧1(−1)k0n=1k为n的不同素因子个数,且每个素因子只拥有一个otherwise
性质:莫比乌斯函数不仅是积性函数,且满足∑d∣nu(d)={1n=10n≠1
\begin{aligned}性质: 莫比乌斯函数不&仅是积性函数,且满足\\
\sum_{d|n} u(d) &= \begin{cases}
1 & n=1\\
0 & n \neq 1\\
\end{cases}\\
\end{aligned}
性质:莫比乌斯函数不d∣n∑u(d)仅是积性函数,且满足={10n=1n=1
这个函数在反演中会很常见,经常性的需要求 前缀和 or O(1)查询,我们可以用素数筛O(n)预处理. 准确的来说,所有的积性函数都可以通过素数筛O(n)求出.但不同的积性函数的转移略有不同,这个函数在反演中会很常见,经常性的需要求\ \textbf{前缀和} \ or \ \textbf{O(1)查询},我们可以用素数筛O(n)预处理.\\
~\\
准确的来说,所有的积性函数都可以通过素数筛O(n)求出.但不同的积性函数的转移略有不同,这个函数在反演中会很常见,经常性的需要求 前缀和 or O(1)查询,我们可以用素数筛O(n)预处理. 准确的来说,所有的积性函数都可以通过素数筛O(n)求出.但不同的积性函数的转移略有不同,
void getMu() {
mu[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!flg[i]) p[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
flg[i * p[j]] = 1;
if (i % p[j] == 0) {
mu[i * p[j]] = 0; // 不同的积性函数可以这里会有差异.
break;
}
mu[i * p[j]] = -mu[i];
}
}
}
莫比乌斯反演:
若f(n)=∑d∣ng(d),则g(n)=∑d∣nu(d)f(⌊nd⌋) 若f(n) = \sum_{d|n} g(d), \\ 则g(n) = \sum_{d|n} u(d)f(\lfloor \frac n d \rfloor) 若f(n)=d∣n∑g(d),则g(n)=d∣n∑u(d)f(⌊dn⌋)
证明:
f=g∗1两边同时卷积:f∗u=g∗1∗u利用结合律:f∗u=g\begin{aligned}f &= g*1\\
两边同时卷积:\qquad f*u &=g*1*u\\
利用结合律: \qquad f*u &=g
\end{aligned}
f两边同时卷积:f∗u利用结合律:f∗u=g∗1=g∗1∗u=g
反演结论:
[gcd(i,j)=1] ⟺ ∑d∣gcd(i,j)u(d) 通过上面u(n)的定义,显然这个式子是成立的 [gcd(i,j)=1] \iff \sum_{d|gcd(i,j)} u(d) \\ ~\\ 通过上面u(n)的定义,显然这个式子是成立的 [gcd(i,j)=1]⟺d∣gcd(i,j)∑u(d) 通过上面u(n)的定义,显然这个式子是成立的