P5282 【模板】快速阶乘算法(倍增)

题面

传送门

前置芝士

优化后的\(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)\]

扫描二维码关注公众号,回复: 5793315 查看本文章

\[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)\]

猜你喜欢

转载自www.cnblogs.com/bztMinamoto/p/10661226.html