题面
前置芝士
优化后的\(MTT\)(四次\(FFT\))
题解
这里有多点求值的做法然而被\(shadowice\)巨巨吊起来打了一顿,所以来学一下倍增
\(Min_{25}\)牛逼!(据说这是原文然而我看不懂就是了)
真的快的不要不要的……
和多点求值一样,我们还是设\(s=\sqrt{n}\),并设多项式
\[g_s(x)=\sum_{i=1}^s(x+i)\]
求出\(g_s(0),g_s(s),g_s(2s),..,g_s((s-1)s)\)的值,最后再乘上\(\prod_{i=s^2+1}^ni\)即可
具体来说我们现在要完成两个操作
已知
\[g_d(0),g_d(s),...g_d(ds)\]
求
\[g_{2d}(0),g_{2d}(s),g_{2d}(2s),...,g_{2d}(2ds)\]
通过这个操作我们可以把\(d\)乘\(2\)
已知
\[g_d(0),g_d(s),...g_d(ds)\]
求
\[g_{d+1}(0),g_{d+1}(s),...g_{d+1}((d+1)s)\]
通过这个操作我们可以把\(d\)加\(1\)
然后就可以用一个类似快速幂的迭代来求出\(g_s\)了
把\(d\)加\(1\)
这个简单一点先说这个好了
对于\(g_{d+1}((d+1)s)\),直接暴力计算就行了
对于剩下的项,也可以直接暴力计算,因为有
\[g_{d+1}(x)=g_{d}(x)\times (x+d+1)\]
那么一次的复杂度就是\(O(s)\)的
把\(d\)乘\(2\)
这种情况就比较辣手了
具体来说,我们已知
\[g_d(0),g_d(s),..,g_d(ds)\]
需要求
\[g_{2d}(0),g_{2d}(s),g_{2d}(2s),...,g_{2d}(2ds)\]
我们先考虑一下,已知
\[g_d(0),g_d(s),..,g_d(ds)\]
如何求出
\[g_d((d+1)s),g_d((d+2)s),..,g_d((d+d)s)\]