题解 P3784 [SDOI2017] 遗忘的集合

$\texttt{link}$

题意

集合 $S$ 中有若干种物品,每种物品体积为 $v_i$,且有无限个,$\forall i\in\left[1,m\right]$,用 $S$ 中的物品装 $i$ 体积的方案数为 $f_i$,现给出 $f_i \bmod p$,求 $S$。

$1\le m<2^{18},10^6\le p<2^{30},p\in \mathbf{Prime}$

题解

题意本来不是这样表述的,我改成这样是为了与 P4389 对比,可以看下我那题的 Solution,这道题就是逆了过来。

考虑若给出 $S$,求 $f_i$ 该怎么做,设 $n=|S|$。

写出 $f$ 的 OGF $F(x)=\sum\limits_{i=0}^\infty f_ix^i$。

若仅有一个体积为 $v$ 的物品,$F(x)=\sum\limits_{i=0}^\infty \left[v|i\right]x^i=\sum\limits_{i\ge 1}x^{iv}$。

如果表为 $1+x^v+x^{2v}+\cdots$,这个等比数列求和很熟悉吧?乘个 $x^v$ 相减得 $F(x)=\sum\limits_{i\ge 1} x^{iv}=\dfrac{1}{1-x^v}$。

那么答案即为 $n$ 个这样的生成函数的卷积。

如果直接暴力乘,复杂度为 $O(nm\log m)$,肯定不行。

前面的形式幂形式不大好搞,我们考虑怎么卷这个封闭形式。

一个经典 trick,可以用取 $\ln$ 的方式把乘变成加,令 $G(x)=\ln F(x)$,有

$$\begin{aligned}G'(x)&=\ln'F(x)\\&=\dfrac{F'(x)}{F(x)}\\&=\dfrac{F'(x)}{\frac{1}{1-x^v}}\\&=(1-x^v)\sum\limits_{i\ge1}iv\cdot x^{iv-1}\\&=\sum\limits_{i\ge1}iv\cdot x^{iv-1}-\sum\limits_{i\ge1}iv\cdot x^{(i+1)v-1}\\&=\sum\limits_{i\ge1}iv\cdot x^{iv-1}-\sum\limits_{i\ge2}(i-1)v\cdot x^{iv-1}\\&=v\cdot x^{v-1}+\sum\limits_{i\ge2}iv\cdot x^{iv-1}-\sum\limits_{i\ge2}(i-1)vx^{iv-1}\\&=\sum\limits_{i\ge1}vx^{iv-1}\end{aligned}$$

两边积回来

$$G(x)=\sum\limits_{i\ge 1}\dfrac{1}{i}x^{iv}$$

于是枚举 $m$ 种体积,如果有该体积的物品直接在对应次项系数上加,最后做一次 $\exp$ 即可,时间复杂度 $O(m\log m)$。

那反过来想,现在知道 $F(x)$,先做一次 $\ln$ 求出 $G(x)$,思考能否根据 $G(x)$ 求出 $S$。

考虑一个贪心的取法,因为每一项的系数都是由它的次数的因数所贡献的,所以我们从小到大扫一遍。

设 $a=\min\{k|\left[ x^k\right]G(x)\not=0\}$,即当前次数最小的,且系数不为 $0$ 的项。

因为 $a$ 次以下的项系数均为 $0$ 肯定没有它的因数可以给它贡献了,说明 $S$ 中必有体积为 $a$ 的物品,将所有 $a$ 的倍数次项的贡献都减掉,再去看下一个,重复这个过程直到 $G(x)=0$。

容易证明这样构造是合法的,且是唯一解。

时间复杂度 $O(m\log m)$。

但这道题的恶心之处在于它任意模数,要 MTT,不想写也不会写,所以没有代码。

posted @ 2021-12-16 13:58  Terac  阅读(13)  评论(0)    收藏  举报  来源