整除分块
用于快速求解形如下面的和式:
\[\sum_{i=1}^n f(i)g(\left \lfloor \frac{n}{i} \right \rfloor )
\]
通过预处理出 \(f(x)\) 的前缀和,可以在 \(O(\sqrt{n})\) 的时间内求出上面的式子.
性质
性质 1
令 \(D(n)=\{\left \lfloor \frac{n}{i} \right \rfloor|i\in[1,n]\bigcap N_+\}\),则有 \(|D(n)|\le 2\sqrt{n}\)
证明:
若 \(i\le\sqrt{n}\),则至多有 \(\sqrt{n}\) 种取值;
若 \(i>\sqrt{n}\),则 \(\left \lfloor \frac{n}{i} \right \rfloor<\sqrt{n}\),则至多有 \(\sqrt{n}\) 种取值;
综上,至多有 \(2\sqrt{n}\) 种取值.
性质 2
对于 \(d\in D(n)\),所有满足 \(\left \lfloor \frac{n}{i} \right \rfloor=d\) 的整数 \(i\) 的取值为:
\[\left \lfloor \frac{n}{d+1} \right \rfloor+1 \le i\le\left \lfloor \frac{n}{d} \right \rfloor
\]
证明:
由于 \(\left \lfloor \frac{n}{i} \right \rfloor=d\),故有 \(d\le\frac{n}{i}<d+1\).
进一步地,有 \(\frac{n}{d+1}<i\le\frac{n}{d}\).
由于 \(i\in N_+\),所以有 \(\left \lfloor \frac{n}{d+1} \right \rfloor+1 \le i\le\left \lfloor \frac{n}{d} \right \rfloor\).
性质 3
若 \(m\in D(n)\),则有 \(D(m)\subseteq D(n)\).
证明:
设 \(m=\left \lfloor \frac{n}{k} \right \rfloor\),那么:
\[\left \lfloor \frac{m}{i} \right \rfloor=\left \lfloor \frac{\left \lfloor \frac{n}{k} \right \rfloor}{i} \right \rfloor=\left \lfloor \frac{n}{ki} \right \rfloor\in D(n)
\]
过程
对于和式:
\[\sum_{i=1}^n f(i)g(\left \lfloor \frac{n}{i} \right \rfloor )
\]
我们将 \(\left \lfloor \frac{n}{i} \right \rfloor\) 相同的,使用乘法分配律,放在一起处理:
void Solve(){
int n,ans=0;
for(int L=1,R;L<=n;L=R+1)
R=n/(n/L),ans+=(f[R]-f[L-1])*g[n/L];
}
其他
k 元形式
用于求解形如下面的和式:
\[\sum_{i=1}^n f(i)g(\left \lfloor \frac{n_1}{i} \right \rfloor,\left \lfloor \frac{n_2}{i} \right \rfloor,\dots,\left \lfloor \frac{n_k}{i} \right \rfloor)
\]
将代码中的 \(R\) 换成 \(R\gets \min\{\left \lfloor \frac{n_1}{d} \right \rfloor,\left \lfloor \frac{n_2}{d} \right \rfloor,\dots,\left \lfloor \frac{n_k}{d} \right \rfloor\}\) 即可.
k 元的整除分块,时间复杂度为 \(O(k^2\sqrt{n})\).
证明:
定义 \(n_i\) 变化点:若 \(j\) 满足:\(\left \lfloor \frac{n_i}{j+1} \right \rfloor\ne \left \lfloor \frac{n_i}{j} \right \rfloor\),则其为一个变化点,显然 \(n_i\) 的变化点至多有 \(2\sqrt{n_i}\) 个.
因此 \(n_1,n_2,\dots,n_k\) 的变化点至多有 \(2k\sqrt{n}\) 个.
而代码中 \(R\) 一定是一个变化点,因此 \(R\) 至多有 \(2k\sqrt{n}\) 中.
算上枚举 \(\min\) 的 \(O(k)\) 的复杂度,得出最终复杂度为 \(O(k^2\sqrt{n})\).
神秘恒等式
$\forall a,b,c\in N_+,\left \lfloor \frac{a}{bc} \right \rfloor =\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c} \right \rfloor $
证明:
设 \(\frac{a}{b}=\left\lfloor\frac{a}{b}\right\rfloor+r(0\le r<1)\)
则有:
\[\left \lfloor \frac{a}{bc} \right \rfloor =\left \lfloor\left (\lfloor \frac{a}{b} \right \rfloor+r)\times\frac{1}{c} \right \rfloor=\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c} \right \rfloor
\]
现证明:$\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c} \right \rfloor=\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c} \right \rfloor $
\[\begin{aligned}
&\left \lfloor \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c} \right \rfloor=\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right \rfloor \\
\Leftrightarrow & \frac{\left \lfloor \frac{a}{b} \right \rfloor }{c}+\frac{r}{c}<\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right \rfloor+1\\
\Leftrightarrow & \left \lfloor \frac{a}{b} \right \rfloor+r<\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right\rfloor\times c+c\\
\Leftrightarrow & \left \lfloor \frac{a}{b} \right \rfloor-\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor }{c}\right\rfloor\times c+r<c\\
\Leftrightarrow & r<c-\left \lfloor \frac{a}{b} \right \rfloor\bmod c\\
\Leftrightarrow & r<1\\
\end{aligned}
\]
得证.
Dirichlet 卷积
定义
数论函数 \(f(n)\) 和 \(g(n)\) Dirichlet 卷积,记作 \(f\circ g\),定义为数论函数:
\[(f\circ g)(n)=\sum_{k|n}f(k)g(\frac{n}{k})
\]
性质
设 \(f,g,h\) 都是数论函数,有:
- 交换律:\(f\circ g=g\circ f\)
- 结合律:\((f\circ g)\circ h=f\circ (g\circ h)\)
- 分配律:\((f+g)\circ h=f\circ h+g\circ h\)
- 单位元:\(f\circ \varepsilon =f\)
上面的性质代入验证即可得证.
计算
一般地,直接利用定义计算:
\[h(n)=\sum_{kl=n}f(k)g(l)
\]
直接枚举 \(k\) 与 \(l\),将贡献累加到 \(h(kl)\) 上:
void calc(){
for(int k=1;k<=n;k++)
for(int l=1;k*l<=n;k++)
h[k*l]+=f[k]*g[l];
}
这样时间复杂度就是:
\[O(\sum_{k=1}^{n}\frac{n}{k})=O(n\log n)
\]
莫比乌斯反演
莫比乌斯函数
定义莫比乌斯函数 \(\mu(n)\):
\[\mu(n)=\begin{cases}
0 &,\exists d>1,d^2|n\\
(-1)^k &,n 有 k 个质因子\\
\end{cases}
\]
莫比乌斯函数性质
性质 1
\(\mu(n)\) 是积性函数
证明:分类验证即可.
性质 2
\[\sum_{d|n}\mu(d)=[n=1]=\varepsilon(n)
\]
也就是:
\[\mu\circ 1=\varepsilon
\]
证明:
由唯一分解定理,令 \(n=p_1^{k_1}p_2^{k_2}\dots p_m^{k_m},n'=p_1p_2\dots p_m\)
由于有重复质因子的数不会产生贡献,因此:
\[\sum_{d|n}\mu(d)=\sum_{d|n'}\mu(d)=\sum_{i=0}^m\binom{m}{i} (-1)^{i}\\
=\sum_{i=0}^m\binom{m}{i} (-1)^{i}1^{m-i}=(1+(-1))^m=[m=0]=[n=1]
\]
莫比乌斯函数计算
可以用 \(O(\sqrt{n})\) 的质因数分解单次计算:
int mu(int x){
int ans=1;
for(int i=2;i*i<=x;i++)
if(x%i==0){
int cnt=0;
while(x%i==0)x/=i,cnt++;
if(cnt>1)return 0; ans=-ans;
}
if(x>1)ans=-ans; return ans;
}
由于 \(\mu(n)\) 为积性函数,因此可以 \(O(n)\) 用线性筛求解:
int prim[N],top,mu[N]; bool vis[N];
void init(){
for(int i=2;i<=1e5;i++){
if(!vis[i])prim[++top]=i,mu[i]=-1;
for(int j=1;i*prim[j]<=1e5;j++){
vis[i*prim[j]]=1,mu[i*prim[j]]=-mu[i];
if(i%prim[j]==0){ mu[i*prim[j]]=0; break; }
}
}mu[1]=1;
}
莫比乌斯反演
\[f(n)=\sum_{d|n}g(d) \Leftrightarrow g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d})
\]
证明:
\[\begin{aligned}
g(n)&=\sum_{d|n}\mu(d)f(\frac{n}{d})\\
&=\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}g(k)\\
&=\sum_{k|n}g(k)\sum_{d|\frac{n}{k}}\mu(d)\\
&=\sum_{k|n}g(k)[\frac{n}{k}=1]\\
&=g(n)
\end{aligned}
\]
另外,还有第二种形式:
\[f(n)=\sum_{n|d}g(d) \Leftrightarrow g(n)=\sum_{n|d}\mu(d)f(\frac{d}{n})
\]
证明同理.
神秘恒等式
先来推一些式子,方便以后的推导:
恒等式 1
\[[\gcd(i,j)=1]=\sum_{d}[d|i][d|j]\mu(d)
\]
证明:
\[[\gcd(i,j)=1]=\sum_{d|\gcd(i,j)}\mu(u)=\sum_{d}[d|i][d|j]\mu(d)
\]
恒等式 2
\[\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x]=\sum_{d}\mu(d)\left\lfloor\frac{n}{dx}\right\rfloor \left\lfloor\frac{m}{dx}\right\rfloor
\]
证明:
\[\begin{aligned}
\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x]
&=\sum_{i=1}^n\sum_{j=1}^m[\gcd(\frac{i}{x},\frac{j}{x})=1]\\
&=\sum_{i=1}^{\left\lfloor\frac{m}{x}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{x}\right\rfloor}[\gcd(i,j)=1]\\
&=\sum_{i=1}^{\left\lfloor\frac{m}{x}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{x}\right\rfloor}\sum_{d}[d|i][d|j]\mu(d)\\
&=\sum_{d}\mu(d)\sum_{i=1}^{\left\lfloor\frac{m}{x}\right\rfloor}[d|i]\sum_{j=1}^{\left\lfloor\frac{m}{x}\right\rfloor}[d|j]\\
&=\sum_{d}\mu(d)\left\lfloor\frac{n}{dx}\right\rfloor \left\lfloor\frac{m}{dx}\right\rfloor
\end{aligned}
\]
例题
依据题意,写出下面的式子:
\[\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)\in P]
\]
化简:
\[\begin{aligned}
\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)\in P]
&=\sum_{i=1}^n\sum_{j=1}^m\sum_{p\in P}[\gcd(i,j)=p]\\
&=\sum_{p\in P}\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=p]\\
&=\sum_{p\in P}\sum_{d}\mu(d)\left\lfloor\frac{n}{dp}\right\rfloor \left\lfloor\frac{m}{dp}\right\rfloor\\
\end{aligned}
\]
发现,这里面有一个 \(dp\) 乘积的形式,如果转化为除法,就能触发 Dirichlet 卷积.
于是,令 \(T=dp\),有:
\[ans=\sum_{T}\sum_{p\in P\wedge p|T}\mu(\frac{T}{p})\left\lfloor\frac{n}{T}\right\rfloor \left\lfloor\frac{m}{T}\right\rfloor
\]
令 \(f(T)=\sum_{p\in P\wedge p|T}\mu(\frac{T}{p})\),有:
\[ans=\sum_{T}f(T)\left\lfloor\frac{n}{T}\right\rfloor \left\lfloor\frac{m}{T}\right\rfloor
\]
预处理出 \(f(T)\) 的前缀和,就可以用整除分块 \(O(\sqrt{n})\) 求解.
上面换元的方法在很多题中都能使用,需要注意.
依据题意,写出下面的式子:
\[ans=\sum_{i=1}^n\sum_{j=1}^m[\sigma(\gcd(i,j))\le a]\times \sigma(\gcd(i,j))
\]
化简:
\[\begin{aligned}
ans
&=\sum_{i=1}^n\sum_{j=1}^m\sum_k[\sigma(k)\le a]\times \sigma(k)\times [\gcd(i,j)=k]\\
&=\sum_k^{\sigma(k)\le a}\sigma(k)\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=k]\\
&=\sum_k^{\sigma(k)\le a}\sigma(k)\sum_{d}\mu(d)\left\lfloor\frac{n}{dk}\right\rfloor \left\lfloor\frac{m}{dk}\right\rfloor\\
&=\sum_k^{\sigma(k)\le a}\sum_{d}\sigma(k)\mu(d)\left\lfloor\frac{n}{dk}\right\rfloor \left\lfloor\frac{m}{dk}\right\rfloor\\
\end{aligned}
\]
同理,令 \(T=dk\),有:
\[ans=\sum_{T}\sum_{k|T}^{\sigma(k)\le a}\sigma(k)\mu(\frac{T}{k})\left\lfloor\frac{n}{T}\right\rfloor \left\lfloor\frac{m}{T}\right\rfloor
\]
令 \(f(T)=\sum_{k|T}^{\sigma(k)\le a}\sigma(k)\mu(\frac{T}{k})\),由于这个式子其实本质是二元函数,
因此我们拿出常用处理二维问题的技巧:主席树/扫描线,这道题空间较小,只能用扫描线.
剩下的就是整除分块了;时间复杂度为 \(O(n\log^2n+Q\sqrt{n}\log n)\).
首先,你需要知道一个恒等式:
\[d(ij)=\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]
\]
证明:
令 \(i=\prod p_k^{\alpha_k},j=\prod p_k^{\beta_k}\),因此 $ij=\prod p_k^{\alpha_k+\beta_k} $
对于每一个因子,考虑贡献:左边产生的贡献为 \(\alpha_k+\beta_k+1\)(就是 \(d\) 函数的展开公式).
对于右边,需要钦定 \(x,y\) 其中一个的指数为 \(0\),再去除重复的 \((0,0)\),得出贡献为 \(\alpha_k+\beta_k+1\).
再将贡献乘起来就是左右两边的贡献,显然是相等的,故得证.
剩下的就比较简单了:
\[\begin{aligned}
ans
&=\sum_{i=1}^{n}\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]\\
&=\sum_{i=1}^{n}\sum_{j=1}^m\sum_{x|i}\sum_{y|j}\sum_{d}[d|x][d|y]\mu(d)\\
&=\sum_{d}\mu(d)\sum_{i=1}^{n}\sum_{x|i}[d|x]\sum_{j=1}^m\sum_{y|j}[d|y]\\
&=\sum_{d}\mu(d)\sum_{i=1}^{n}d(\frac{i}{d})\sum_{j=1}^md(\frac{j}{d})\\
&=\sum_{d}\mu(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}d(i)\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}d(j)\\
\end{aligned}
\]
令 \(f(n)=\sum_{i=1}^n d(n)\),有:
\[ans=\sum_{d}\mu(d)f(\left\lfloor\frac{n}{d}\right\rfloor)f(\left\lfloor\frac{m}{d}\right\rfloor)
\]
使用整除分块求解.
依据题意,写出下面的式子:
\[ans=\sum_{i=1}^n\sum_{j=1}^m \operatorname{lcm}(i,j)
\]
化简:
\[\begin{aligned}
ans
&=\sum_{i=1}^n\sum_{j=1}^m \operatorname{lcm}(i,j)\\
&=\sum_{i=1}^n\sum_{j=1}^m \frac{ij}{\gcd(i,j)}\\
&=\sum_{i=1}^n\sum_{j=1}^m\sum_{d}\frac{ij}{d}[\gcd(i,j)=d]\\
&=\sum_d\frac{1}{d}\sum_{i=1}^n\sum_{j=1}^mij[\gcd(i,j)=d]\\
&=\sum_d\frac{1}{d}\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}i\times d\times j\times d[\gcd(i,j)=1]\\
&=\sum_d d\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}ij[\gcd(i,j)=1]\\
&=\sum_d d\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}ij\sum_{k}[k|i][k|j]\mu(k)\\
&=\sum_d\sum_{k}\mu(k)d\sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}i[k|i]\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}j[k|j]\\
&=\sum_d\sum_{k}\mu(k)d\frac{(k+\left\lfloor\frac{n}{dk}\right\rfloor k)\left\lfloor\frac{n}{dk}\right\rfloor}{2}\frac{(k+\left\lfloor\frac{m}{dk}\right\rfloor k)\left\lfloor\frac{m}{dk}\right\rfloor}{2}\\
&=\sum_d\sum_{k}\mu(k)dk^2\frac{(1+\left\lfloor\frac{n}{dk}\right\rfloor)\left\lfloor\frac{n}{dk}\right\rfloor}{2}\frac{(1+\left\lfloor\frac{m}{dk}\right\rfloor)\left\lfloor\frac{m}{dk}\right\rfloor}{2}\\
&=\sum_T\sum_{k|T}\mu(k)kT\frac{(1+\left\lfloor\frac{n}{T}\right\rfloor)\left\lfloor\frac{n}{T}\right\rfloor}{2}\frac{(1+\left\lfloor\frac{m}{T}\right\rfloor)\left\lfloor\frac{m}{T}\right\rfloor}{2}\\
\end{aligned}
\]
整除分块即可.