QOJ #9448. Product Matrix
这居然是能快速插值的?
首先令 \(A_{i,x,y}=a_{x,y}2^i+b_{x,y}\),则 \(\prod\limits_{i=k}^{k+m-1} A_i\) 的 \((1,1)\) 位置相当于将 \(x=2^k\) 代入答案多项式得到的点值。可以用矩阵乘法在 \(O(mn^3)\) 时间复杂度内求出这 \(m+1\) 个点值。
然后我们需要插值出原来的多项式。记 \(2^i\) 处的点值为 \(v_i\),考虑直接使用拉格朗日插值,可以得到
\[f(x)=\sum\limits_{i=0}^{m} v_i\prod\limits_{i\not=j} \frac{x-2^j}{2^i-2^j}
\]
乘积式下部容易计算,记每个 \(v_i\) 乘上对应分母之后的值为 \(w_i\),则相当于要求
\[f(x)=\prod\limits_{i=0}^{m}(x-2^i)\sum\limits_{i=0}^{m} \frac{w_i}{x-2^i}
\]
前一部分可以分治计算:对于某个 \(m\),先算出前 \(\frac{m}{2}\) 个数乘起来的结果,后 \(\frac{m}{2}\) 个数乘起来的结果是可以用前面推出来的,然后乘起来即可。时间复杂度 \(T(m)=T(\frac{m}{2})+O(m\log m)\) 有 \(T(m)=O(m\log m)\)。
后一部分考虑在 \(0\) 点处泰勒展开,可以得到
\[\sum\limits_{i=0}^{m} \frac{w_i}{-2^i}\sum\limits_{j\geq 0}x^j2^{-ij}
\]
要对于每个 \(x_i\) 求出其系数,这个可以使用 Chirp Z-Transform \(O(m\log m)\) 计算。最后再把两部分乘起来即可。
时间复杂度 \(O(m\log m+mn^3)\)。