Difficulty:5.0 / Template
题意解析:给定两个多项式,求它们的积。将结果每一项对 998244353 取模。
假设积的次数为 n−1,其中 n 为 2 的正整数次幂。如果不是的话补成二的正整数次幂就行。
朴素方法是直接枚举两个多项式的每一项,乘起来。但这样的话是 O(n2) 的,太慢了。
注意到有一个定理:n 个不同的值可以表示出唯一一个不超过 n−1 项式。所以考虑一种神秘的方法:取 n 个不同的值分别代入多项式,然后将两个多项式的值乘起来,再用某种方法还原出乘积。
例如两个多项式分别为 x+1 与 x−2,我们取一些值分别代入:
- x=1→x+1=2,x−2=−1,(x+1)(x−2)=−2。
- x=2→x+1=3,x−2=0,(x+1)(x−2)=0。
- x=3→x+1=4,x−2=1,(x+1)(x−2)=4。
对于 (1,−2),(2,0),(3,4) 进行求解,解得多项式为 x2−x−2。
但我们发现,如果只是代入整数的话,解起来十分困难。
考虑复数领域的单位根 ωn=cos(n2π)+isin(n2π)。
这个单位根其实就是 1 逆时针旋转了 n1×360°。
这玩意有个性质,就是乘几次方就旋转几倍的度数,也就是说 ωnk 是 1 逆时针旋转 nk×360°。
进一步的结论:
- ωn0=ωnn=1。
- 对于任意整数 n,k,ω2nk=−ω2nk+n。
- 对于任意整数 k,ωn=ωnkk。
那这个性质有什么用呢?我们可以发现通过单位根,可以很方便地逆向推导出原数组!
假设 f(x)=∑i=0n−1aixi ,代入后的点是 (ωn0,y0),(ωn1,y1),...,(ωnn−1,yn−1)。
记多项式 f′(x)=∑i=0n−1yixi。
我们把单位根分别的倒数 ωnn,ωnn−1,...,ωn1 依次代入,得
(ωnn,z0),(ωnn−1,z1),...,(ωn1,zn−1)。
此时有
zk=i=0∑n−1yiωn−i×k=i=0∑n−1(j=0∑n−1aj×ωni×j×ωni×(−k))=i=0∑n−1aj×(j=0∑n−1ωni×(j−k))
当 j=k 时,里面那一项是 n,否则由等比数列求和可知里面那一项是 0。
所以此时 zk=n×ak。
我们只需要把每一项 zk 求出来,除以 n 就能还原出 f(x) 了。
但此时如果暴力分别计算 f(x) 还是 O(n2) 的。
推柿子。
令 f1(x)=∑i=02na2ixi,f2(x)=∑i=02na2i+1xi,则有 f(x)=f1(x2)+xf2(x2)。
令 t=ωnk,则有 f(t)=f1(t2)+tf2(t2);
f(−t)=f1(ωn2k+n)+ωnk+2nf2(ωn2k+n)=f1(ωn2k)+ωnk+2nf2(ωn2k+n)=f1(ωn2k)−ωnkf2(ωn2k+n)=f1(t2)−tf2(t2)
所以,我们只需要得出 f1(t2) 与 f2(t2) 就可以同时知道 f(t) 与 f(−t) 的值!
这样,我们只需要将 k∈[0,2n) 分别代入 t,分别计算出 f1,f2 即可得出 n 个单位根的值,而 f1 与 f2 也可以通过这种方式递归。
T(n)=2T(n/2)+O(n),主定理一下会发现是 O(nlogn) 的。
这样,我们就在 O(nlogn) 的复杂度内求出了两个长度为 O(n) 的多项式之积!
还没写完。
这周写吧。
有帮助,赞一个