反射容斥学习小记
常见形式为从 \((0,0)\) 出发可以向右上和右下走,求走到 \((n,m)\) 且不碰到 \(y=a\) 与 \(y=b\) (\(a \lt 0 \lt b\))的方案。
记事件 \(A\) 为触碰到 \(y=a\),\(B\) 同理,那么大概就是要把一个触碰事件非空的给容斥掉。
考虑记形如 \(f(ABAB)\) 的为钦定按某种顺序发生触碰事件的路径数,那么
\[f(\emptyset)-f(A)-f(B)+f(AB)+f(BA)-f(ABA)-f(BAB)+\cdots
\]
即为答案,证明形如集合容斥。
\((n,m)\) 经过 \(A\) 事件 \(\to\) \((n,2a-m)\)
\((n,m)\) 经过 \(B\) 事件 \(\to\) \((n,2b-m)\)
\((n,m)\) 经过 \(AB\) 事件 \(\to\) \((n,2b-2a+m)\)
\((n,m)\) 经过 \(BA\) 事件 \(\to\) \((n,2a-2b+m)\)
于是可以统一表示为
\[\begin{aligned}
& g(n,m)-g(n,2a-m)-g(n,2b-m)+g(n,2b-2a+m)+g(n,2a-2b+m)+\cdots \\
= & (\sum_i g(n,m+2i(a-b))) - (\sum_i g(n,2i(a-b)-m+2a))
\end{aligned}
\]
要想 \(g(n,x)\) 有值,则 \(|x|\) 为 \(O(n)\),故 \(i\) 的取值只有 \(O(\frac {n} {b-a})\),若对 \((n,a+1) \sim (n,b-1)\) 都求一遍时间复杂度为 \(O(n)\)。
本文来自博客园,作者:lnw143,转载请注明原文链接:https://www.cnblogs.com/lnw143/p/19448501

浙公网安备 33010602011771号