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∗Σai∗max(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=1∑aki!(−1)ak−i(i−1ak−1)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]−k−t]+=f[i−1][j]∗Ca[i]−1k−1∗Cjt∗Cs[i−1]−j+1k−t
三个组合数的意思分别是分组可行方案数,j组分t组可行方案数,剩下插入的方案数。
至于其他部分,可以自己模拟一下。