对于一个n次函数
P(x)=a0+a1x+a2x2+....anxn
P
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
.
.
.
.
a
n
x
n
如果要求这个函数的系数,有两种通用的方法,一种是
n3
n
3
的高斯消元,一种是
n2logn
n
2
l
o
g
n
的拉格朗日插值
但如果要求这个函数在
x=k
x
=
k
处的点值,拉格朗日插值可以做到
O(n)
O
(
n
)
(或者
O(nlogn)
O
(
n
l
o
g
n
)
)
这个东西主要是一个构造
一个n次函数要至少n+1个点才能唯一确定,我们先取
(x0,y0),(x1,y1).....(xn,yn)
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
.
.
.
.
.
(
x
n
,
y
n
)
这n+1个点
然后我们构造出一些多项式
l(i)=∏nj=0,j≠i(x−xj)(xi−xj)
l
(
i
)
=
∏
j
=
0
,
j
≠
i
n
(
x
−
x
j
)
(
x
i
−
x
j
)
,可以发现,
l(i)
l
(
i
)
只有在
xi
x
i
处取到值1,在
xj(j≠i)
x
j
(
j
≠
i
)
处都取到0
那么
yil(i)
y
i
l
(
i
)
这个多项式就可以取到点
(xi,yi)
(
x
i
,
y
i
)
且不影响其他n个点
P(x)=∑ni=0l(i)yi P ( x ) = ∑ i = 0 n l ( i ) y i
然后这个东西用fft加速卷积的话,可以 n2logn n 2 l o g n 找到一个n次多项式,如果是取一个点的值的话,发现分子那里可以 O(n) O ( n ) 算出n+1个数的乘积再乘上对应的逆元,分子那里是两个阶乘乘积,注意一下符号,如果逆元那里可以做到 O(n) O ( n ) 就可以 O(n) O ( n ) 求点值
一道例题:bzoj3453
先对g(i)做插值,卷积可以直接暴力卷,n^3求出一个k+2次的多项式,然后要求g(A)+g(A+d)+g(A+2d)….+g(A+nd),可以枚举我们插出来的g(i)的多项式的第i项,相当于要计算
Ai+(A+d)i+....+(A+nd)i
A
i
+
(
A
+
d
)
i
+
.
.
.
.
+
(
A
+
n
d
)
i
,这个东西是个i+1次的多项式,我们可以用上面提到的那个方法,
O(nlogn)
O
(
n
l
o
g
n
)
得到他在n处的值,带进g(i)的多项式