2018.10.23 NOIP训练 Leo的组合数问题(组合数学+莫队)

传送门
好题。
考察了莫队和组合数学两个知识板块。


首先需要推出单次已知 n , m n,m n,m的答案的式子。
我们令 f [ i ] f[i] f[i]表示当前最大值为第 i i i个数的方案数。
显然 i i i之后的数都是单调递减且连续的。
所以后面的方法是1种。
考虑第 1 1 1~ i − 1 i-1 i1个位置。
显然放法数为 ∑ j = 1 i − 1 f [ j ] \sum _{j=1} ^{i-1}f[j] j=1i1f[j]
又因为 f [ 1 ] = 1 , f [ i − 1 ] = ∑ j − 1 i − 2 f [ j ] f[1]=1,f[i-1]=\sum _{j-1} ^{i-2}f[j] f[1]=1,f[i1]=j1i2f[j]
因此 f [ i ] = ∑ j = 1 i − 1 f [ j ] = ∑ j = 1 i − 2 f [ j ] + f [ i − 1 ] = 2 ∗ f [ i − 1 ] = 2 i f[i]=\sum _{j=1} ^{i-1}f[j]=\sum _{j=1} ^{i-2}f[j]+f[i-1]=2*f[i-1]=2^i f[i]=j=1i1f[j]=j=1i2f[j]+f[i1]=2f[i1]=2i
于是此时 A n s = ∑ i = 1 n ( m i ) ∗ 2 i − 1 Ans=\sum _{i=1} ^n \binom {m} {i}*2^{i-1} Ans=i=1n(im)2i1
然后考虑在已知当前答案时如何快速求出其它答案。
我们把 n , m n,m n,m看成两个下标 l , r l,r l,r,现在要转移到 l ′ , r ′ l',r' l,r
唉是不是有点莫队的味道。
于是我们只需要考虑如何 O ( 1 ) O(1) O(1)转移。
S ( l , r ) = ∑ i = 1 l ( r i ) ∗ 2 i − 1 S(l,r)=\sum _{i=1} ^l \binom {r} {i}*2^{i-1} S(l,r)=i=1l(ir)2i1
于是
S ( l + 1 , r ) = S ( l , r ) + ( r l + 1 ) ∗ 2 l S(l+1,r)=S(l,r)+\binom {r} {l+1}*2^l S(l+1,r)=S(l,r)+(l+1r)2l

S ( l − 1 , r ) = S ( l , r ) − ( r l ) ∗ 2 l − 1 S(l-1,r)=S(l,r)-\binom {r} {l}*2^{l-1} S(l1,r)=S(l,r)(lr)2l1
r的转移可以在杨辉三角上面看。
相当于把一行上下挪动。
推一推发现:
S ( l , r + 1 ) = 3 S ( l , r ) + ( r 0 ) ∗ 2 0 − ( r l ) ∗ 2 l S(l,r+1)=3S(l,r)+\binom {r} {0}*2^0-\binom {r} {l}*2^l S(l,r+1)=3S(l,r)+(0r)20(lr)2l

S ( l , r − 1 ) = S ( l , r ) + ( r − 1 l ) ∗ 2 l − ( r 0 ) ∗ 2 0 3 S(l,r-1)=\frac {S(l,r)+\binom {r-1} {l}*2^l-\binom {r} {0}*2^0} {3} S(l,r1)=3S(l,r)+(lr1)2l(0r)20

发现这些东西预处理之后都是可以 O ( 1 ) O(1) O(1)转移的。
于是就可以用莫队了。
代码

你可能感兴趣的:(#,莫队算法,#,组合数学)