给定$n-1$次多项式$F(x)$与整数$k$,求$\bmod x^n$意义下的$(F(x))^k$。
$\texttt{Data Range:}n\leq 10^5,2\leq k\leq 10^{10^5}$
前置知识
多项式基本操作,不会请右转模板区qwq。
题解
首先大力推一波式子
取下对数
再取一下指数
很明显,时间复杂度是$O(n\log n)$,但是如果像我一样写代码会$\texttt{TLE 8-20}$,于是来践行OI界的优良传统卡常数。
前方大图警告
中间有$\texttt{selftest}$的是我的自测,数据比这一题强。
首先看一份比较$\texttt{naive}$的代码(只有$\texttt{35 pts}$,吸氧后在$\texttt{selftest}$上跑还只有$\texttt{45070ms}$):
1 |
|
首先考虑把一些调用次数多而短的函数给搞掉。
一眼看过去,调用次数最多的是$\texttt{qadd}$和$\texttt{qmin}$,于是考虑吧这两个函数搞掉,把一些副本放到函数里面开$\texttt{static}$,于是就优化到了$\texttt{31078ms}$。
接下来,就可以考虑压缩$\texttt{deriv}$和$\texttt{integ}$了,尽管代码里只有调用一次,但是$\texttt{exp}$中会调用$\log n$次,所以果断搞掉,现在时间是$\texttt{28972ms}$。
接着考虑删掉一些不必要的参数,因为传$\texttt{int}$是$O(32)$的。于是可以考虑删掉$\texttt{mod}$,因为这题只有一个模数,用不着加这样一个参。
经过毒瘤卡常后,一个$\texttt{45000+ms}$的代码被优化成了$\texttt{12000-ms}$,可以见得卡常是个好东西。
代码
1 |
|