o_o 当前时间是:

4:02:41 AM

 

P5824 十二重计数法

洛谷题面传送门

solution

n 个球和 m 个盒子。

case 1

球不同,盒不同

答案为 mn

case 2

球不同,盒不同,一个盒子内至多一个球

n>m 显然答案为 0

否则,第一个球有 m 种放法,第二个有 m1 种。以此类推,答案为 m!(mn)!

case 3

球不同,盒不同,盒子至少一个球。

fk 表示恰有 k 个盒子为空的方案数,hk 表示钦定 k 个盒子为空的方案数。

hk=(mk)(mk)n,且 hk=i=km(ik)fi

二项式反演得 fk=i=km(1)ik(ik)hi

答案即为 f0=i=km(1)ihi

case 4

球不同,盒相同

相当于把 n 个数划分成 m 个集合的方案数。

先考虑恰有 k 个盒子为空的方案数 gk

因为集合互不区分,所以 gk=1m!fkfk 在 case 3 中定义)。

那么这个 case 的答案就是 i=0mgi

{fk}k=0m 的指数生成函数是 F{(1)i}i=0m 的指数生成函数是 G{in}i=0m 的指数生成函数是 H

fk 的展开式可知,F=G×H

NTT 即可求出所有 fk(0km)

case 5

球不同,盒相同,盒内至多放一个球

n>m,答案为 0。

否则,答案为 1。

case 6

球不同,盒相同,盒内至少放一个球

答案就是 case 4 中的 g0

case 7

球全部相同,盒子不同。

插板可知答案为 (n+m1m1)

case 8

球全部相同,盒子不同,盒内至多一个球

相当于从 m 个盒子中选出 n 个放球。

答案为 (mn)

case 9

球全部相同,盒子不同,盒内至少一个球

插板,(n1m1)

case 10

fn,m 表示答案。

枚举有几个盒子是空的,然后剩下的盒子都至少有一个小球,将每个盒子内的小球数量减 1,就变成了一个子问题。

fn,m=i=1mfni,i。(注意没有考虑 m 个盒子是空的情况,因为只有 n=m=0 时它才对答案有贡献)。

下一步怎么做?一个有趣的办法是注意到 fn,m1=i=1m1fni,i

fn,m 减去 fn,m1 得,fn,m=fn,m1+fnm,m

n 放在第二维,设 Fm{fi,m}i=0n 的生成函数,则有 Fm=Fm1+xmFm,即 Fm=Fm11xm

把递归式展开得 Fm=F0×i=1m11xi

考虑如何计算 i=1m11xi

G=i=1m11xi

lnG=i=1mln(11xi)

由于 ln(1x)=1ixii

所以 lnG=i=1m1jxijj

可以发现,在 mod xm 意义下,有用的 j 的取值只有 m(1+12+13+)=O(mlogm) 个,所以我们很容易构造出 lnG

然后对 lnG 做多项式 exp 就做完了。

case 11

球相同,盒子相同,每个盒子至多装一个球

显然,答案同 case 5

case 12

球相同,盒子相同,每个盒子至少装一个球。

用类似 case 10 的方式考虑。

gn,m 表示本 case 答案。

将所有盒子的球数减 1,接着枚举有几个空盒子,然后剩余部分就变成子问题了。

gn,m=i=0mgnm,i

同样地用做差的方式得出,gn,m=gn1,m1+gnm,m

我们惊奇的发现,这个式子和 case 10 的极为相似。

事实上,用同样的放法计算可以发现,本 case 最终的多项式只比 case 10 多乘了一个 xm

于是就做完啦。

code

人傻常数大

hint

我做这个题并不是按 1 ~ 12 的顺序的。

可以优先做 6,12 再做 3,4,10。

之前没见过分拆数,做了一上午

posted @   zzafanti  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示