对于一个n次函数P(x)=a0+a1x+a2x2+....anxnP(x)=a0+a1x+a2x2+....anxn
如果要求这个函数的系数,有两种通用的方法,一种是n3 n3 的高斯消元,一种是n2logn n2logn 的拉格朗日插值
但如果要求这个函数在x=k x=k 处的点值,拉格朗日插值可以做到O(n)O(n)(或者O(nlogn)O(nlogn))
这个东西主要是一个构造
一个n次函数要至少n+1个点才能唯一确定,我们先取(x0,y0),(x1,y1).....(xn,yn)(x0,y0),(x1,y1).....(xn,yn)这n+1个点
然后我们构造出一些多项式
l(i)=∏nj=0,j≠i(x−xj)(xi−xj)l(i)=∏j=0,j≠in(x−xj)(xi−xj),可以发现,l(i)l(i)只有在xixi处取到值1,在xj(j≠i) xj(j≠i) 处都取到0
那么yil(i) yil(i) 这个多项式就可以取到点(xi,yi) (xi,yi) 且不影响其他n个点
P(x)=∑ni=0l(i)yiP(x)=∑i=0nl(i)yi
然后这个东西用fft加速卷积的话,可以n2logn n2logn 找到一个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)iAi+(A+d)i+....+(A+nd)i,这个东西是个i+1次的多项式,我们可以用上面提到的那个方法,O(nlogn)O(nlogn)得到他在n处的值,带进g(i)的多项式