本题可以做到线性。
首先显然我们
0 无所谓,计算
f(m) 表示只有
m 个
1/2 的方案数,然后加起来,
ans=m=0∑n(mn)×f(m)。
考虑
f(m) 怎么算。首先
∑<X−1 肯定是对的。这个我们可以先计算。设
F(n,m) 表示
n 个值域
[1,2] 内的数和为
m 的方案数,这个显然就是
(m−nn)。枚举
s∈[0,X−1),先把
∑F(m,s) 算到贡献里。
然后注意到,如果
s≥X−1,则序列一定出现了
X−1 这个前缀和。
因为你不可能出现
X,又不可能直接跳到
X+1(序列内值域为
[1,2])。
然后我们枚举什么时候
X−1 这个前缀和出现,设
j=1∑iaj=X−1,则可以发现,
ai+1=2,因为填
1 就出现
X 了。而
a1=2,因为如果填
1 则
[2,i+1] 就是
X 了。
同理可以推出来
j∈[1,m−i] 和
j∈[i+1,m] 的
aj 都必须是
2。
若
m−i≥i+1 就是全填
2,可以直接判掉。如果
2i≥X−1 且
X 是奇数,那么全填
2 就合法。
若
m−i<i+1 那么就是
m−2×(m−i) 个值域在
[1,2] 的数,要求和为
X−1−2×(m−i)。就是
F(m−2×(m−i),X−1−2×(m−i))。
然后
O(n2) 就做完了。
考虑优化到
O(n)。
首先前面的这个
∑F(m,s) 先展开成
j=0∑min{m,X−1−m−1}(jm)。
然后
m−i≥i+1 这个显然取到
i=⌊(m−1)/2⌋,这个可以直接判掉。
剩下的就是
i=⌊(m−1)/2⌋+1∑m(X−1−m2×i−m)。
这个是上指标求和但是隔一个求一个。
现在我们考虑怎么求这个。接下来的部分抄袭了 ChatGPT。
设
k=X−1−m,我们关心的是
j=0∧j≡m(mod2)∑m(kj)。
设
Sodd=j≡1(mod2)∑(kj),Seven=j≡0(mod2)∑(kj)。
设
A=j=0∑m(kj),B=j=0∑m(−1)j(kj)。
则
A=Seven+Sodd,B=Seven−Sodd。
所以
ans=2A+(−1)mB。
考虑
A 怎么算。这个是上指标求和,曲棍球恒等式,
A=(k+1m+1)。
因为
(kj)=[xk](1+x)j,所以有:
B=j=0∑m(−1)j(kj)=[xk]j=0∑m(−1)j(1+x)j=[xk]j=0∑m(−(1+x))j=[xk]j=0∑m1−(−(1+x))1−(−(1+x))m+1
其中最后一步是等比数列求和。
化简一下分母:
B=[xk]j=0∑m2+x1−(−(1+x))m+1。
我们分成两部分:
B=[xk]j=0∑m2+x1−[xk]j=0∑m2+x(−(1+x))m+1。
第一部分:
2+x1=21×1+2x1=21×s≥0∑(−1)s(2x)s=s≥0∑(−1)s2−s−1xs
所以
[xk]j=0∑m2+x1=[xk]2+x1=(−1)k2−(k+1)=(−1)k2k+11。
第二部分:
首先
(−(1+x))m+1=(−1)m+1(1+x)m+1。
然后你拿
2+x1 的形式幂级数和
(1+x)m+1=t=0∑m+1(tm+1)xt 卷到一起。
[xk]2+x(1+x)m+1=t=0∑k(tm+1)×[xk−t]2+x1=t=0∑k(tm+1)×(−1)k−t2−(k−t+1)
所以这个式子最后就是:
==(−1)m+1t=0∑k(tm+1)×(−1)k−t2−(k−t+1)(−1)m+1(−1)k2k+11t=0∑k(tm+1)×(−1)t2t(−1)m+1(−1)k2k+11t=0∑k(tm+1)×(−2)t
然后考虑怎么求:
t=0∑k(tm+1)×(−2)t
这个。
这个是下指标求和带一个
(−2)t。
类似于普通的动态下指标求和,这里改下指标也是可以
O(1) 的。然后上指标增加的转移是
n←n+1,ans←2×(−2)k×(kn)−ans。
好的,然后推完了,预处理阶乘、阶乘逆元、
2k,
2−k 等即可做到
O(n)。