题解 P3784 [SDOI2017] 遗忘的集合

link

题意

集合 S 中有若干种物品,每种物品体积为 vi,且有无限个,i[1,m],用 S 中的物品装 i 体积的方案数为 fi,现给出 fimodp,求 S

1m<218,106p<230,pPrime

题解

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

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

写出 f 的 OGF F(x)=i=0fixi

若仅有一个体积为 v 的物品,F(x)=i=0[v|i]xi=i1xiv

如果表为 1+xv+x2v+,这个等比数列求和很熟悉吧?乘个 xv 相减得 F(x)=i1xiv=11xv

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

如果直接暴力乘,复杂度为 O(nmlogm),肯定不行。

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

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

G(x)=lnF(x)=F(x)F(x)=F(x)11xv=(1xv)i1ivxiv1=i1ivxiv1i1ivx(i+1)v1=i1ivxiv1i2(i1)vxiv1=vxv1+i2ivxiv1i2(i1)vxiv1=i1vxiv1

两边积回来

G(x)=i11ixiv

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

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

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

a=min{k|[xk]G(x)0},即当前次数最小的,且系数不为 0 的项。

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

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

时间复杂度 O(mlogm)

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

posted @   Terac  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示