Description
有n种颜色的球,每种颜色有a[i]个,要把这些球排成一行,相邻的两个位置颜色不能相同,问可行排法。
Analysis
2019/2/21 UPD:
默认球不可区分,可区分只需要将不可区分的答案乘上∏ai!\prod a_i!∏ai!即可
使用容斥原理做可以做到O(n∗Σai∗max(ai))O(n*\Sigma a_i*max(a_i))O(n∗Σai∗max(ai))甚至更优的复杂度
基本思路就是用无限制-至少一对相邻+至少两对…
考虑到对相邻对个数的贡献,每种颜色独立,我们可以分开考虑
对于颜色kkk的生成函数为
fk(x)=∑i=1ak(−1)ak−i(ak−1i−1)xii!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=1∑aki!(−1)ak−i(i−1ak−1)xi
其中iii为枚举将aka_kak分为iii段
把多项式全部乘起来就可以求答案了
以下为原文
竟然是原题,比赛时我竟然没有想到,也没有看出来是原题( ⊙ o ⊙ ),做过的题又不会做了我真是。。。。
只能怪自己太弱!
其实比赛的时候知道是DP,一直在设状态乱搞。
题解的dp方法的思路非常值得学习。
设f[i][j]f[i][j]f[i][j]表示做了前i种颜色,产生了j个不合法的位置。
那我们新来一种颜色,其实就是将若干个相同颜色的球插进原先的一个序列里。
设s[n]=∑i=1na[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]∗Ca[i]−1k−1∗Cjt∗Cs[i−1]−j+1k−tf[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]∗Ca[i]−1k−1∗Cjt∗Cs[i−1]−j+1k−t
三个组合数的意思分别是分组可行方案数,j组分t组可行方案数,剩下插入的方案数。
至于其他部分,可以自己模拟一下。