关于卷积的结合律
其结合律与矩阵乘法类似。
下文中 \(f_{i,*}\) 表示卷积 \(i\) 次后的结果。
\((+,\times)\) 卷积
即多项式乘法,这个结合律显然,处理的时候既可以直接使用标准的多项式快速幂,也可以倍增。
\[已知:f_{i,j}=\sum_k f_{i-1,k}\times f_{1,j-k}\\
有结论:f_{x+y,j}=\sum_k f_{x,k}\times f_{y,j-k}
\]
这个由多项式乘法证明显然。
\((\min,+)\) 卷积,\((\max,+)\) 卷积
这里以 \((\min,+)\) 卷积为例。
\[已知:f_{i,j}=\min_k \{f_{i-1,k}+f_{i-1,j-k}\}\\
有结论:f_{x+y,j}=\min_k\{f_{x,k}+f_{y,j-k}\}
\]
可以用数学归纳法证明:
对于一个 \(x\) 假设 \(y=k\) 是成立现在要证明 \(y=k+1\) 时成立:
\[\begin{aligned}
f_{x+k+1,j}&=\min\limits_o\{f_{x+k,o}+f_{1,j-o}\}\\
&=\min\limits_o\{\min\limits_p\{f_{x,p}+f_{k,o-p}\}+f_{1,j-o}\}\\
&=\min\limits_p\{f_{x,p}+\min\limits_o\{f_{k,o-p}+f_{1,j-o}\}\}\\
&=\min\limits_p\{f_{x,p}+f_{k+1,j-p}\}
\end{aligned}
\]
所以 \(y=k+1\) 的时候也成立,而 \(y=1\) 时显然成立,所以原命题成立。
这以上这三种卷积其实是利用了 \((*,\cdot)\) 中 \((a*b)\cdot c=(a\cdot c)*(b\cdot c)\) 的分配律证明。
迪利克雷卷积
\[已知:f_{i,j}=\sum_{k|j}f_{i-1,k}\times f_{1,\frac jk}\\
有结论:f_{x+y,j}=\sum_{k|j}f_{x,k}\times f_{y,\frac jk}
\]
证明与上文类似,用数学归纳法可以解决。
对于一个 \(x\) 假设 \(y=k\) 是成立现在要证明 \(y=k+1\) 时成立:
\[\begin{aligned}
f_{x+k+1,j}&=\sum_{o|j}f_{x+k,o}\times f_{1,\frac jo}\\
&=\sum_{o|j}(\sum_{p|o}f_{x,p}\times f_{k,\frac op})\times f_{1,\frac jo}\\
&=\sum_{p|j}f_{x,p}(\sum_{t|\frac jp}f_{k,t}f_{1,\frac j{pt}})\\
&=\sum_{p|j}f_{x,p}\times f_{k+1,\frac jp}\\
\end{aligned}
\]
所以 \(y=k+1\) 的时候也成立,而 \(y=1\) 时显然成立,所以原命题成立。
同理我们可以得到 \((\min,+)\),\((\max,+)\) 版的迪利克雷卷积,这里以 \((\min,+)\) 为例:
\[已知:f_{i,j}=\min_{k|j}\{f_{i-1,k}+f_{1,\frac jk}\}\\
有结论:f_{x+y,j}=\min_{k|j}\{f_{x,k}+f_{y,\frac jk}\}
\]
证明与上文类似,这里不再赘述。
子集卷积
\[已知:f_{i,S}=\sum_{T\subseteq S} f_{i-1,T}\times f_{1,S\setminus T}\\
有结论:f_{x+y,S}=\sum_{T\subseteq S}f_{x,T}\times f_{y,S\setminus T}
\]
证明与上文类似,用数学归纳法可以解决。
对于一个 \(x\) 假设 \(y=k\) 是成立现在要证明 \(y=k+1\) 时成立:
\[\begin{aligned}
f_{x+k+1,S}&=\sum_{T\subseteq S} f_{x+k,T}\times f_{1,S\setminus T}\\
&=\sum_{T\subseteq S} (\sum_{V\subseteq T}f_{x,V}\times f_{k,T\setminus V})\times f_{1,S\setminus T}\\
&=\sum_{V\subseteq S} f_{x,V}\times f_{k+1,S\setminus V}\\
\end{aligned}
\]
所以 \(y=k+1\) 的时候也成立,而 \(y=1\) 时显然成立,所以原命题成立。
同理我们可以得到 \((\min,+)\),\((\max,+)\) 版的子集卷积,这里以 \((\min,+)\) 为例:
\[已知:f_{i,S}=\min_{T\subseteq S}\{ f_{i-1,T}+f_{1,S\setminus T}\}\\
有结论:f_{x+y,S}=\min_{T\subseteq S}\{f_{x,T}+f_{y,S\setminus T}\}
\]
证明与上文类似,这里不再赘述。
变式
然而很多时候遇到的 dp 式虽然形如卷积却又不严格规范,这时我们应该运用证明方法进行探究。现在举个例子(来自“[省选联考 2024] 虫洞”):
\[已知:f_{1,*}=1,f_{i,j}=\sum_{x|j}\frac{f_{i-1,x}}{x}
\]
我们去探索上文的结合律表达式,首先推导一个 \(x\to x+2\) 的表达式。
\[\begin{aligned}
f_{i+2,j}=&\sum_{x|j}\frac {f_{i+1,x}}{x}\\
=&\sum_{x|j}\sum_{y|x}\frac{f_{i,y}}{xy}\\
=&\sum_{y|x}\frac{f_{i,y}}{y^2}\sum_{x|\frac jy}\frac 1x\\
=&\sum_{y|j}\frac{f_{i,y}f_{2,\frac iy}}{y^2}
\end{aligned}
\]
于是我们猜测有表达式。
\[f_{x+y,j}=\sum_{k|j}\frac{f_{x,k}f_{y,\frac jk}}{k^y}
\]
现在用数学归纳法进行证明。
对于一个 \(x\) 假设 \(y=k\) 是成立现在要证明 \(y=k+1\) 时成立:
\[\begin{aligned}
f_{x+k+1,j}&=\sum_{o|j}\frac{f_{x+k,o}}{o}\\
&=\sum_{o|j}\frac{\sum_{p|o}\frac{f_{x,p}f_{k,\frac op}}{p^k}}{o}\\
&=\sum_{p|j}\frac{f_{x,p}}{p^{k+1}}\sum_{p|o,o|j}\frac{f_{k,\frac op}}{\frac op}\\
&=\sum_{p|j}\frac{f_{x,p}f_{k+1,\frac jp}}{p^{k+1}}
\end{aligned}
\]
所以 \(y=k+1\) 的时候也成立,而 \(y=1\) 时显然成立,所以原命题成立。
只要掌握了这种推导方法,那么这类问题就可以迎刃而解。
用处:
一些 dp 式本质是进行多次卷积(比如上文的 \(f\) 都是 dp 式),利用“卷积的结合律”,将一些需要 \(\mathcal O(n)\) 的递推的 dp 式通过倍增将复杂度将为从 \(\mathcal O(\log n)\)。
具体地,我们倍增处理出 \(f_{1,*},f_{2,*},f_{4,*}\cdots\) 的值。假设我们最终要求 \(f_{n,*}\) 的值,只需要根据 \(n\) 的二进制下 01 状态将这些值拼起来就行了,与快速幂的逻辑相似。
示例代码(来自“[省选联考 2024] 虫洞”,其中 \(p\) 表示上文“变式”中的 \(f\)):
void P(){
for(int i=1;i<=n;i++)p[0][i]=1;
p_final[1]=1;
for(int i=1;i<=__lg(K);i++)//处理出卷二的整数次幂次后的值
for(int j=1;j<=n;j++)
for(int k:fc[j])(p[i][j]+=p[i-1][k]*p[i-1][j/k]%MOD*inv[i-1][k])%=MOD;//QP(2,i-1)是放在指数上的,应该%(MOD-1)而非%MOD
for(int i=__lg(K);i>=0;i--){//拼起来
if((K>>i)&1){
for(int j=n;j>=1;j--){
int tmp=0;
for(int k:fc[j])(tmp+=p_final[k]*p[i][j/k]%MOD*inv[i][k])%=MOD;
p_final[j]=tmp;
}
}
}
return;
}