POJ 3718
题目描述-戳我跳转
有一些灯泡,给定其现在状态,每次选取3个不同灯泡拉下开关,求有 m m m次操作后达到目标状态的方案数
这道题粗略分析是dp,当然可以考虑用组合数学
解法1-组合数学
也就是拉下 3 × m 3 \times m 3×m次灯泡,一个灯泡最多拉 m m m次,我们可以先将那些未达到目标状态的灯泡先拉一次,后面每个灯泡拉两次即可
解法2-计数dp
首先 d p i , j dp_{i,j} dpi,j表示操作 i i i次以后有 j j j个亮着的方案数
接下来有 4 4 4种情况
1.在j个亮着的灯泡中有0个灯泡选中
d
p
i
+
1
,
j
+
3
=
d
p
i
,
j
×
C
n
−
j
3
dp_{i+1,j+3}=dp_{i,j} \times \mathtt{C}^{3}_{n-j}
dpi+1,j+3=dpi,j×Cn−j3
2.在j个亮着的灯泡中有1个灯泡选中
d
p
i
+
1
,
j
+
1
=
d
p
i
,
j
×
C
n
−
j
2
×
C
j
1
dp_{i+1,j+1}=dp_{i,j} \times \mathtt{C}^{2}_{n-j} \times \mathtt{C}^{1}_{j}
dpi+1,j+1=dpi,j×Cn−j2×Cj1
3.在j个亮着的灯泡中有2个灯泡选中
d
p
i
+
1
,
j
−
1
=
d
p
i
,
j
×
C
n
−
j
1
×
C
j
2
dp_{i+1,j-1}=dp_{i,j} \times \mathtt{C}^{1}_{n-j} \times \mathtt{C}^{2}_{j}
dpi+1,j−1=dpi,j×Cn−j1×Cj2
4.在j个亮着的灯泡中有3个灯泡选中
d
p
i
+
1
,
j
−
3
=
d
p
i
,
j
×
C
j
3
dp_{i+1,j-3}=dp_{i,j} \times \mathtt{C}^{3}_{j}
dpi+1,j−3=dpi,j×Cj3
对于
d
p
i
,
j
dp_{i,j}
dpi,j但是会重复
d
p
n
−
2
,
j
∗
(
n
3
−
j
+
2
)
dp_{n-2,j}*(\frac{n}{3}-j+2)
dpn−2,j∗(3n−j+2)
最后还要乘上
1
j
\frac{1}{j}
j1,因为可能出现在
j
j
j种情况中
注意
1 j \frac{1}{j} j1与 m o d mod mod需要使用乘法逆元,要预处理;而组合数也需要先预处理