max+或 卷积

我是 sb。

其实高精度乘法有个 \(3^{\log_2 n}=n^{\log_2 3}\) 的远古做法,考虑做两个 \(2^k\) 位数 \(A,B\) 乘法,我们可以将 \(A,B\) 分别折半变成 \(A=A_1+A_2\times 2^{k-1},B=B_1+B_2\times 2^{k-1}\) ,令 \(x =2^{k-1}\)

然后发现答案 \(A\times B=(A_1+A_2x)(B_1+B_2x)=A_1B_1+A_2B_2x^2+x(A_1B_2+A_2B_1)\)

注意到 \(A_1B_2+A_2B_1=(A_1+A_2)(B_1+B_2)-A_1B_1-A_2B_2\)

考虑求出 \(A_1B_1,A_2B_2,(A_1+A_2)(B_1+B_2)\) ,于是变成三次多项式乘法,以及若干次多项式平移以及加减法。

复杂度 \(T(n)=3T\left(\dfrac n2\right)+\Theta(n)=3^{\log_2 n}\)。被 FFT 平替后就没人管这东西了。


回归 max + 或卷积 的问题。

\[c_i=\max_{j|k=i}a_j+b_k \]

我们同样考虑分治折半的做法,将三个序列折半,分别记为 \(a_0,a_1,b_0,b_1,c_0,c_1\)。加法表示对应加,\(\max\) 表示对应位取 \(\max\)。我们有

\[c_0=a_0+b_0 \]

\[c_1=\max(a_0+b_1,a_1+b_0,a_1+b_1)=\max(a_0+b_1,a_1+\max(b_0,b_1)) \]

我们递归下去做就行,复杂度跟上边的多项式乘法复杂度是相同的, \(T(n)=3T\left(\dfrac n2\right)+\Theta(n)=3^{\log_2 n}\)

max + 或卷积的部分参考了 https://www.luogu.me/article/5l2ultk8 ,这个博客里有个清新的实现。

posted @ 2025-08-22 16:09  yzq_yzq  阅读(45)  评论(2)    收藏  举报