P6076 [JSOI2015] 染色问题

原题

题解里大部分做法要做两次二项式反演,不知为何有点喜感

为什么大家都说这题是傻子题啊,我想了将近半小时的说QwQ

老规矩,先说我的做法:


方法1:

我一开始也想到了要做两次二项式反演,但感觉好麻烦,于是把一个二项式反演换成了dp,复杂度就差了一些

首先我们发现行列的限制不好容斥,因此我们考虑容斥颜色的限制。具体的,设fi表示有至少i个颜色不选的方案数,gi表示恰好有i个颜色不选的方案数。可以得到gi=j=in(1)ji(ji)fj,于是我们考虑怎么求fi

我们考虑一个比较朴素的dp,设dpi,j,k表示前i行染了j列,能染k种颜色的方案数

可以得到递推式:

dpi,j,k=(l=0j(jl)kl)×l=0mj(mjl)kldpi1,jl

其中l=0j(jl)kl表示染过的列也可以再染的方案数;l=0mj(mjl)kldpi1,jl则表示这一行中选一些没染的列染掉的方案数

于是我们考虑怎么优化:

首先前面l=0j(jl)kl这部分可以预处理掉,我们不妨设si,j=l=0i(il)jl

然后我们推一下dpi,j1,k,看两个式子有没有什么共同点

(1)dpi,j1,k=sj1,k×l=0mj+1(mj+1l)kldpi1,jl1(2)=sj1,k×(l=0mj(mj+1l+1)kl+1dpi1,jl+dpi1,j1)(3)=sj1,k×(l=0mj(mj+1)!(l+1)!(mjl)!kl+1dpi1,jl+dpi1,j1)(4)=sj1,k×(mj+1)!×k×l=0mjkldpi1,jl(l+1)!(mjl)!+sj,k×dpi1,j1(5)=.....

好吧,推着推着突然发现自己推不下去了,还是直接说结果把:

dpi,j,k=(mj)×k×dpi,j+1,k+dpi1,j,k×sj,k

于是我们就可以O(nmc)的得到dp答案,fi=dpn,m,ci,最终复杂度O(n3)


方法2:

首先我们处理颜色全部使用的限制:设fi表示只用了i中颜色,并且满足行和列染色限制的方案数,可以得到:

Ans=i=0c(1)ci(ci)fci

然后我们考虑怎么计算fi。我们固定每一行都要染色,选其中的k列随便染色,然后用二项式反演容斥计算:

fi=k=0m(1)mk(mk)((i+1)k1)n

其中(i+1)k1表示固定的这k列随便染,而1是减掉全为空的情况。最终复杂度O(cmlogn)

posted @   FOX_konata  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示