【JZOJ 3424】 粉刷匠 /【JZOJ 4254】 集体照

58 篇文章 0 订阅
17 篇文章 0 订阅

Description

有n种颜色的球,每种颜色有a[i]个,要把这些球排成一行,相邻的两个位置颜色不能相同,问可行排法。

Analysis

2019/2/21 UPD:
默认球不可区分,可区分只需要将不可区分的答案乘上 ∏ a i ! \prod a_i! ai!即可
使用容斥原理做可以做到 O ( n ∗ Σ a i ∗ m a x ( a i ) ) O(n*\Sigma a_i*max(a_i)) O(nΣaimax(ai))甚至更优的复杂度
基本思路就是用无限制-至少一对相邻+至少两对…
考虑到对相邻对个数的贡献,每种颜色独立,我们可以分开考虑
对于颜色 k k k的生成函数为
f k ( x ) = ∑ i = 1 a k ( − 1 ) a k − i ( a k − 1 i − 1 ) x i i ! f_k(x)=\sum_{i=1}^{a_k}\dfrac{(-1)^{a_k-i} {a_k-1 \choose i-1} x^i}{i!} fk(x)=i=1aki!(1)aki(i1ak1)xi
其中 i i i为枚举将 a k a_k ak分为 i i i
把多项式全部乘起来就可以求答案了


以下为原文

竟然是原题,比赛时我竟然没有想到,也没有看出来是原题( ⊙ o ⊙ ),做过的题又不会做了我真是。。。。
只能怪自己太弱!
其实比赛的时候知道是DP,一直在设状态乱搞。
题解的dp方法的思路非常值得学习。
f [ i ] [ j ] f[i][j] f[i][j]表示做了前i种颜色,产生了j个不合法的位置。
那我们新来一种颜色,其实就是将若干个相同颜色的球插进原先的一个序列里。
s [ n ] = ∑ i = 1 n a [ i ] s[n]=\sum_{i=1}^na[i] s[n]=i=1na[i],k表示将当前第i种颜色的球分成k组,t表示有t组将插到原来的j个不合法位置,则转移方程为
f [ i ] [ j + a [ i ] − k − t ] + = f [ i − 1 ] [ j ] ∗ C a [ i ] − 1 k − 1 ∗ C j t ∗ C s [ i − 1 ] − j + 1 k − t f[i][j+a[i]-k-t]+=f[i-1][j]*C_{a[i]-1}^{k-1}*C_{j}^{t}*C_{s[i-1]-j+1}^{k-t} f[i][j+a[i]kt]+=f[i1][j]Ca[i]1k1CjtCs[i1]j+1kt
三个组合数的意思分别是分组可行方案数,j组分t组可行方案数,剩下插入的方案数。
至于其他部分,可以自己模拟一下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值