多项式倍增

让你用lg的时间复杂度求下面这东西(n<1e18)

$$
\begin{aligned}
&\prod_{i=1…n}{(2i-1)} %2^{64}\&
suppose\quad that\quad f(x,n)=(2x+1)(2x+3)(2x+5)…(2x+2n-1)%2^{64}\&
then \quad the \quad 0th \quad item \quad of \quad f(x,n) \quad is \quad answer\&
we \quad can \quad try \quad to\quad calculate \quad f(x,n) \quad by \quad f(x,\left \lfloor \frac{n}{2} \right \rfloor) \&
let \quad y=x+n\&
then \quad f(y,n)=(2y+1)(2y+3)(2y+5)…(2y+2n-1)%2^{64}\&
so \quad f(x+n,n)=(2x+2n+1)(2x+2n+3)(2x+2n+5)…(2y+4n-1)%2^{64}\&
Surprisedly \quad we \quad find \quad that \quad f(x,2n)=f(x,n)*f(x+n,n)\&
which \quad means \quad we \quad can \quad calculate\quad f(x,2n)\quad by\quad f(x,n) \quad easy\&
\&
becase \quad we \quad can \quad calculate \quad f(x+n,n)\quad by \quad f(x,n) \&
but \quad we \quad can’t \quad calculate \quad it \quad faster \quad because\quad of\quad the\quad huge\quad numbers \quad of \quad item\&
considering \quad that \quad we \quad need \quad mod \quad 2^{64} , we\quad can \quad reserve \quad the \quad items \quad with \quad index \quad less\quad than\quad 64\&
because \quad the \quad useful \quad information \quad is \quad the \quad 0th \quad item \&
and \quad in \quad f(x,n)\quad when \quad the\quad index\quad of\quad x \quad is \quad larger \quad than\quad 63 ,the \quad coefficient \quad of \quad it \quad must\quad divisible\quad 2^{64}\&
it \quad has \quad no \quad contribution \quad to \quad answer \quad and \quad f(x+n,n)\&
so \quad we \quad can \quad solve \quad it \quad by \quad this \quad way
\&
for \quad every \quad polynomial \quad we \quad reserve\quad the \quad first \quad 64\quad items \quad of\quad x
\& and \quad then \quad calculate \quad f(x,n) \quad by
\left{\begin{matrix}
\quad f(x,\left \lfloor \frac{n}{2} \right \rfloor)*f(x+\left \lfloor \frac{n}{2} \right \rfloor,\left \lfloor \frac{n}{2} \right \rfloor)\quad if \quad n%2=0\&
\quad f(x,\left \lfloor \frac{n}{2} \right \rfloor)f(x+\left \lfloor \frac{n}{2} \right \rfloor,\left \lfloor \frac{n}{2} \right \rfloor)(2x+2n-1) \quad if \quad n%2=1
\end{matrix}\right.
\&
and \quad we \quad can \quad get \quad the \quad answer \quad no \quad more \quad than \quad lg \quad times \quad recursion\&
because \quad of \quad the \quad 64 \quad items \quad only \quad and \quad we \quad don’t\quad care \quad the \quad higher \quad items ,\&
it \quad is \quad very \quad fast \quad to \quad get \quad f(x,n)\quad by \quad f(x+n,n)
\&
so\quad the\quad total\quad time\quad complexity \quad is \quad O(lgn)

\end{aligned}
$$

假设f(x,n)=(2x+1)(2x+3)(2x+5)…(2x+2n-1)%64

然后这东西的0次项系数就是答案

我们尝试通过f(x,n/2)来求f(x,n)

令y=x+n

则f(y,n)=(2y+1)(2y+3)(2y+5)…(2y+2n-1)%64

所以f(x+n,n)=(2x+2n+1)(2x+2n+3)(2x+2n+5)…(2x+4n-1)%64

我们惊讶地发现了f(x,2n)=f(x,n)*(fx+n,n)

这意味着我们可以通过f(x,n)来求f(x,2n)因为我们可以通过f(x,n)求出f(x+n,n)

很遗憾的是这些东西项数太多了

考虑到我们要的是模上2^64的答案,我们可以只保留前64项

因为有用的只有0次项,但是在f(x,n)转移到f(x+n,n)的时候也只有前64项有效,因为大于指数64的项,他们前面的系数一定整除2^64次方,

于是我们就有了做法了

我们保留前64项

时间复杂度为lg级别