UOJ450
【集训队作业2018】复读机
如果不看数据范围的话,这是一个经典问题。
令 $\hat{F} ( x ) = \sum _ {i=0} ^ {\infty} [ d \mid i ] x ^ {i} / i!$,我们要求的答案就是:
$$ Ans = n! \left[ \dfrac { x ^ n } { n ! } \right] \hat{F} ( x ) ^ k $$
但是 $\hat{F} ( x ) $ 的封闭形式不太好找,这个答案根本没法算。
考虑变换 $ \hat {F} ( x )$,使用单位根反演。
$$
\begin{aligned}
\hat{F} ( x ) = & \sum _ { i = 0 } ^ {\infty} \dfrac { x ^ i } { i ! } [ d \mid i ]
\\
= & \dfrac {1} {d} \sum _ { i = 0 } ^ {\infty} \dfrac { x ^ i } { i ! } \sum _ { j = 0 } ^ { d - 1 } \omega _ {d} ^ {ij}
\\
= & \dfrac {1} {d} \sum _ { j = 0 } ^ { d - 1 } \sum _ { i = 0 } ^ {\infty} \dfrac {(x \omega _ {d} ^ {j}) ^ i } { i ! }
\\
= & \dfrac {1} {d} \sum _ { j = 0 } ^ { d - 1 } e ^ { x \omega _ {d} ^ {j} }
\end{aligned}
$$
注意到这个特殊的数据范围,分类讨论 $d$:
若 $d=1$,则有:
$$\hat{F} ( x ) = e ^ x$$
那么答案就是:
$$Ans = n! \left[ \dfrac{x^n}{n!} \right] e ^ {kx} = k ^ n $$
若 $d=2$,则有:
$$\hat{F}(x)= \dfrac {e ^ x + e ^ { - x }} { 2 }$$
代入答案的时候使用二项式定理展开:
$$
\begin{aligned}
Ans = & n! \left[ \dfrac { x ^ n } { n ! } \right] \left( \dfrac {e ^ x + e ^ { - x }} { 2 } \right) ^ k
\\
= & \dfrac { n! } { 2 ^ k } \left[ \dfrac { x ^ n } { n ! } \right] \sum _ { i = 0 } ^ { k } \binom { k } { i } e ^ {ix} e ^ {- ( k - i ) x}
\\
= & \dfrac { n! } { 2 ^ k } \left[ \dfrac { x ^ n } { n ! } \right] \sum _ { i = 0 } ^ { k } \binom { k } { i } e ^ { ( 2 i - k ) x}
\\
= & \dfrac { 1 } { 2 ^ k } \sum _ { i = 0 } ^ { k } \binom { k } { i } ( 2 i - k ) ^ n
\end{aligned}
$$爆算的时间复杂度是 $ O ( k \log n ) $ 的,直接莽。
若 $ d = 3$,则:
$$ \hat { F } ( x ) = \dfrac { e ^ x + e ^ { \omega _ 3 ^ 1 x} + e ^ {\omega _ 3 ^ 2 x}} { 3 }$$
两次二项式定理把这玩意暴力展开:
$$
\begin{aligned}
Ans = & n! \left[ \dfrac { x ^ n } { n ! } \right] \left( \dfrac { e ^ x + e ^ { \omega _ 3 ^ 1 x} + e ^ {\omega _ 3 ^ 2 x}} { 3 } \right) ^ k
\\
= & \dfrac {n!} {3 ^ k} \left[ \dfrac { x ^ n } { n ! } \right] \sum _ { i = 0 } ^ { k } \binom { k } { i } e ^ {\omega _ {3} ^ {2 } x i } \sum _ { j= 0 } ^ { k - i } \binom { k-i } { j } e ^ { x j } e ^ { \omega _ {3} ^ {1} x ( k - i - j )}
\\
= & \dfrac {n!} {3 ^ k} \left[ \dfrac { x ^ n } { n ! } \right] \sum _ { i = 0 } ^ { k } \binom { k } { i } \sum _ { j= 0 } ^ { k - i } \binom { k-i } { j } e ^ {(\omega _ {3} ^ {2} i + j + \omega _ {3} ^ {1} ( k - i - j ))}
\\
= & \dfrac { 1 } {3 ^ k} \sum _ { i = 0 } ^ { k } \binom { k } { i } \sum _ { j= 0 } ^ { k - i } \binom { k-i } { j } \left ( \omega _ {3} ^ {2} i + j + \omega _ {3} ^ {1} ( k - i - j ) \right) ^ {n}
\end{aligned}
$$看起来应该是 $O(k ^ 2 \log n)$ 可算,不过要求一下单位根。
可以直接再写一个求三次单位根的程序,也可以凭借你的聪明才智发现它的原根是 7,然后用 Python 算一下 $7 ^ { \varphi (19491001)/3}$ 即可。
这里我就直接给出 $\omega _ {3} ^ 1 = 663067$。
然后做完了。
代码:
1 |
|