多项式多点求值
jiazhaopeng · · 个人记录
给一
n 次多项式F(x) ,m 次询问,每次求F(x_i) 的值。1 \le n,m \le 64000
EI,rqy
方法:转置原理
通过调整(补常数项,补询问),我们能够让
接下来可能会用到许多线性代数的东西。
-
转置的意思是行列互换,原来
(i,j) 变为现在的(j,i) 。 -
如果
A = E_1E_2E_3 ,那么A^T = E_3^TE_2^TE_1^T 。 -
初等行变换共三种:
x += cy,x *= c,swap(x,y) 。其中x += cy 的矩阵为对角矩阵的第x 行第y 列多了个c ,x *= c 的矩阵为对角矩阵的第x 行第x 列的系数为c ,swap(x,y) 的矩阵为对角矩阵的第x 行为1 的位置出现在了第y 列,第y 行为1 的位置出现在了第x 列。这三种变换的转置分别为y += cx ,不变,不变。 -
所有对某个矩阵
M 进行的线性变换操作均可以看作M 和一个个初等行变换矩阵相乘的形式(我们一般认为相乘为左乘,即将初等行变换矩阵一个个地放到左边) -
多个初等行变换依次进行可以被合并拆分,具有结合律,这些矩阵的转置可以看作倒着做每个变换的转置矩阵。但是多个初等变换同时进行有时候不能被拆分,如
h_1 += h_2,h_2 += 2h_3,h_3 += 3h_1 ,拆分后的变量就变了,只能把它们写到一个矩阵里。这种矩阵的转置可以看作每个变换的转置矩阵同时进行。 -
一个多项式通常可以看作一个列向量。一个多项式乘常多项式可以看作线性变换,比如
f(x)g(x) 可以将其拆为f(x)g_ix^i 相加,而f(x)g_ix^i 可以看作将f(x) 这一列的每一个元素乘上一个g_i 的常数,加到了其下面i 行的那个位置。 -
多项式
F 乘常多项式G 还可以看作这个过程:F 通过DFT 变为F' ,和常多项式的点值(也是常数)G' 对应相乘,再IDFT 变为F 。其中DFT ,对应相乘,IDFT 这三种操作都是线性的,且其转置都是自身(DFT 本质上是一个第i 行第j 列为\omega_n^{(i-1)(j-1)} 的矩阵,显然其转置不变,IDFT 同理,而对应相乘可以看作若干x *= c 依次进行或同时进行)
好的让我们进入正题。
我们要求的是这样的一个矩阵(列向量):
其中
其中左边的叫做范德蒙矩阵,记作
很好求。为什么呢?我们仔细观察,发现这个东西用多项式来表达为:
这个东西可以通过分治套 NTT 暴力通分搞出分子和分母,然后多项式求逆得到答案。复杂度为
考虑到
首先分解
具体地讲,我们设常多项式
- 递归到叶子节点时:
ans_x=f_i - 非叶节点:
-
- 递归儿子求儿子的分子
ans_{l},ans_r 和儿子的分母g_{l},g_r -
ans_x = ans_lg_r+ans_rg_l
- 递归儿子求儿子的分子
如果我们认为列向量
现在我们要探寻
右面那部分比较好算,可以算得:
现在考虑
-
根节点:
h_x -
非叶节点:
-
-
- 分别拿着
h_l 和h_r 递归到俩儿子处继续算
叶节点:
Res_x -
这些操作可以看作是一个多项式逐渐分裂分裂变成一堆零次多项式,而那些零次多项式所组成的矩阵即为所求矩阵
于是一切都结束了。算法流程为:
- 计算分母
g ,注意保留其在每个分治节点上的值。 - 求
g^{-1} ,其转置为自身。 - 定义
\times ^T 表示那种奇葩的先IDFT 再乘再DFT 的乘法。计算g^{-1} \times^T f (左乘)放在根节点准备分治。 - 我们称
h 为上面传下来的多项式,根节点为g^{-1} \times^T f ,那么计算h \times^T g_r 扔到左面递归,计算h \times^T g_l 扔到右面递归。 - 最后叶子节点存的多项式即为答案。