神仙计数题啊。(或者是我计数太烂了?)
首先这个最大前缀和的值很难融入到计数里面,很自然的想到对每个最大前缀和计数然后乘起来相加。
最大前缀和恰好等于某数比较难,套路地按差分思想计算最大前缀和小于等于某数的序列个数。但思考无果(
考虑正难则反,求至少有一个位置的前缀和大于等于该数的序列个数。由于起点从零开始,只要算至少有一个位置的前缀和等于该数的序列个数,即画成折线后穿过 (y=i) 的个数。
首先如果 (n-mgeq i),那么根据离散版的拉格朗日中值定理或者按照图形直观理解,知道所有序列都满足,答案就是 (dbinom{n+m}n)。否则只需要考虑 (n-m<i)。
考虑容斥?考虑仅让第一次到达 (i) 的位置做贡献?都思考无果,最好可以做到 FFT 优化的平方对数。下面就是很神仙的一步了!考虑转化,把至少穿过一次 (y=i) 的折线这样一个不好数的东西转化成另一个东西。我们发现将这样的折线第一次穿过 (y=i) 前面的部分按 (y=i) 翻折依然连续,否则不可能连续。那么容易得到 (2i o n-m) 的折线和这样的折线形成双射。而这是好算的!就是 (dbinom{n'+m'}{n'}),其中 (n',m') 解个方程就可以出来。
时间复杂度平方或线性。
P.S. 解方程过程:(n'-m'=n-m+2i,n'+m'=n+m),解得 (n'=n+i,m'=m-i)。(bzd 是哪个毒瘤管理员连二元一次方程组的解法也要求放在紫题题解里/kel/kel)