Description
给你一个大小为m的集合S,S中不包含n。
现在对于一个正整数序列
a[1]…a[k],如果序列之和为n,且不存在s[i]属于集合S就是合法的,s表示a的前缀和。
这样的序列贡献是
∏ki=1a[i]2
∏
i
=
1
k
a
[
i
]
2
,求所有合法序列的贡献和。
m<=10^5,n<=10^9
Analysis
首先有个naïve的dp,大概是
f[i]=∑i−1j=0f[j]∗(i−j)2
f
[
i
]
=
∑
j
=
0
i
−
1
f
[
j
]
∗
(
i
−
j
)
2
,
∀x∈S,f[x]=0
∀
x
∈
S
,
f
[
x
]
=
0
反正我是不会优化,考虑组合意义?从
(i−j)2
(
i
−
j
)
2
入手,这东西相当于把2个不同的球随便放入i-j个箱子的方案数,然后我们有总共n个箱子,可以在某些箱子之间分隔开
于是可以设
dp[i][0..2]
d
p
[
i
]
[
0..2
]
表示
i
i
<script id="MathJax-Element-333" type="math/tex">i</script>所在的一段中已经放入了0..2个球,这样转移是线性的了
既然是线性的就可以写成转移矩阵,快速幂一下就没了,复杂度O(mlogn)
调试了很久,最后发现是转移矩阵手抖打错,气死。。。
感觉20道题做不完啊要凉凉