这道破题拖了我整整一天。
代数推导
转化为容斥模型
题目所给限制可以表述为,a 和 b 均为单调不降的序列,长度相等(记为 k),且 a1=0,ak=n,b1=0,bk=m,∄i∈[2,k],ai=ai−1∧bi=bi−1。
考虑差分序列 ai’=ai−ai−1(i∈[2,k]),bi’ 同理,它与原序列形成双射。于是不存在 ai’=bi’=0 的差分序列合法。考虑 ∑i=2kai’=n,也就是和为 n 的 k−1 元线性方程组的一组非负整数解;b’ 同理。容易计算“钦定至少有 c 个位置不合法”的方案数——利用容斥原理即可得到长为 k 的合法序列对个数为
c=0∑k−2(ck−1)((k−1)−1−cn+(k−1)−1−c)((k−1)−1−cm+(k−1)−1−c)(−1)c 答案累加上式结果 ×k。
恒等变换
答案=k=2∑n+m+1kc=0∑k−2(k−1−ck−1)(k−2−cn+k−2−c)(k−2−cm+k−2−c)(−1)c=k=2∑n+m+1kc=0∑k−2(c+1k−1)(cn+c)(cm+c)(−1)k−2−c=c=0∑n+m−1(cn+c)(cm+c)(−1)ck=c+2∑n+m+1(−1)kk(c+1k−1)=c=0∑n+m−1(cn+c)(cm+c)(−1)ck=c+2∑n+m+1(−1)k(c+1)!(k−c−2)!k!=c=0∑n+m−1(cn+c)(cm+c)(−1)c(c+2)k=c+2∑n+m+1(−1)k(c+2k)(倒序求和)
递推转移
二项式系数矩阵。黑字表示 h(c+1) 之系数,红字表示 h(c+1) 的等价系数(由递推公式得),蓝字为 h(c) 之系数。
记 h(c)=∑k=cn+m+1(−1)k(ck)。我们难以找到简便的通项公式。尝试将其二项式系数拆分后递推计算。有
h(c+1)=k=c+1∑n+m+1(c+1k)(−1)k=−k=c∑n+m(c+1k+1)(−1)k=−k=c∑n+m((c+1k)+(ck))(−1)k=−(h(c+1)−(c+1n+m+1)(−1)n+m+1+h(c)−(cn+m+1)(−1)n+m+1) 移项整理得到
h(c)=(c+1n+m+2)(−1)n+m+1−2h(c+1) 故而答案为
c=0∑n+m−1(cn+c)(cm+c)(−1)c(c+2)h(c+2)
时间复杂度 O(n+m),组合数应当预处理到 2(n+m) 级别。
Bonus: 无意义过程
记 wk,c=(k−2−cn+k−2−c)(k−2−cm+k−2−c)(−1)cf(k,Δ)=c=0∑k−2(c+Δk−1)wk,c 经过与上文相仿的推导可以发现,有 f(k,Δ)=wk,0(Δk−1)−f(k−1,Δ)−f(k−1,Δ+1)。我们的目标是分别求出 k=2,⋯,n+m+1 的 f(k,0)。考察每一个 wk0,0(Δ0k0−1) 对 f(k,0)(k≥k0) 的贡献。上式除首项以外,递推形式与二项式系数相同(本来就是通过对原式拆系数得到的),因此 wk0,0(Δ0k0−1) 以 (−1)k−k0(Δ0k−k0) 的系数贡献到 f(k,0) 中。
于是考察单个系数对答案的最终贡献。有 wk0,0 的贡献为
==wk0,0Δ0=0∑k0−1(Δ0k0−1)k=k0∑n+m+1(Δ0k−k0)(−1)k−k0kwk0,0k=k0∑n+m+1(Δ0=0∑k0−1(Δ0k0−1)(Δ0k−k0))(−1)k−k0kwk0,0k=k0∑n+m+1(k0−1k−1)(−1)k−k0k(范德蒙德卷积)
然后就殊途同归了。
组合意义