题目链接
做法
以$sum(S)$表示S这个集合中所有人的仇恨值的和。
我们先求$P(S)$表示S中所有的人一定死在第一个人之后的概率,其他人随意。
显然其他人什么时候死我不关心,只考虑下一枪打在S中或者打在1上,所以$P(S)=\frac{a_1}{sum(S)+a_1}$。
考虑最后计算答案,所有人都不能死在1后面。
通过容斥可以得到每个状态S的贡献为,$P(S)*(-1)^{|S|}$
直接计算显然复杂度过大,但是$sum(S)$并不大。
由于容斥系数有-1和1,把方案变成系数和即可。
用$f[i][j]$表示从第二个人开始前i个人,仇恨值为j的系数和。
转移时,考虑第i个人选不选。
如果不选$f[i][j]=f[i-1][j]$
如果选的话,|S|的奇偶性改变,所以系数取负,$f[i][j]-=f[i-1][j-a[i]]$
最后计算答案枚举j即可。
这样可以获得50分的成绩。
发现每次转移等价于乘上一个生成函数$(x^0-x^{a[i]})$,用分治+NTT解决。
代码
1 |
|