CF1920E
被这种题卡了,脸都不要了。
仔细读题,发现序列可以分成两部分( 0 0 0 和 1 1 1)来考虑。
在合法序列中,对于一个
1
1
1,它产生的子串贡献一定是(假设与上一个
1
1
1 之间有
x
x
x 个
0
0
0,与下一个
1
1
1 之间有
y
y
y 个
0
0
0):
(
x
+
1
)
(
y
+
1
)
(x+1)(y+1)
(x+1)(y+1)
如果去 DP 这
n
n
n 个
1
1
1,易得转移方程:
f
i
,
j
=
∑
f
i
−
p
×
j
,
p
f_{i,j}=\sum f_{i-p\times j,p}
fi,j=∑fi−p×j,p
f i , j f_{i,j} fi,j 表示:当前贡献了 i i i 个合法子串,上一个 1 1 1 到现在的 1 1 1 的长度为 j j j 的组成序列方案数。
接下来考虑 p p p 的值域。
要使式子成立,有: p ∈ [ 1 , i j ] p\in [1, \frac{i}{j}] p∈[1,ji]。
考虑题目限制(最长合法串长度不大于 k k k),有: p ∈ [ 1 , k + 1 − j ] p\in [1,k+1-j] p∈[1,k+1−j]。
所以
p
∈
[
1
,
min
{
i
j
,
k
+
1
−
j
}
]
p\in [1,\min\{\frac{i}{j},k+1-j\}]
p∈[1,min{ji,k+1−j}],即:
f
i
,
j
=
∑
p
=
1
min
{
i
j
,
k
+
1
−
j
}
f
i
−
p
×
j
,
p
f_{i,j}=\sum\limits_{p=1}^{\min\{\frac{i}{j},k+1-j\}} f_{i-p\times j,p}
fi,j=p=1∑min{ji,k+1−j}fi−p×j,p