前言
确实是初探,因为以前学得太烂了。。。
参考了这篇日报: https://www.luogu.com.cn/blog/KingSann/chu-tan-rong-chi-yuan-li
下面的(U)是全集,(|S|)表示集合(S)的大小。
正常项的容斥原理
大概长成这个样子吧:
一般化的容斥原理
下面的答案可以指任意答案。
我们假设存在以下函数:
-
(q(S)),表示至少包含属性集合(S)的集合个数
-
(g(n)),表示属性集合大小为(n)的集合对答案产生的贡献
-
(f(i)),表示容斥系数
我们需要我们的(f(i))满足答案为(sum_{Ssubseteq U} q(S)f(|S|))。
那么,我们考虑一个大小为(n)的集合对答案产生的贡献,显然它满足:
这个式子非常显然。
于是,我们就可以推得:
我们就可以递推求得(f(x))。不过这里有一种更快的方法。我们下面假设(F(x))为(f(x))的指数型生成函数(定义(f(0)=0)),(G(x))为(g(x))的指数型生成函数,可以发现:
而我们的(e^{-x})又是(sum_{i=1}^{infty} (-1)^idfrac{x^i}{i!}),于是我们就可以直接多项式乘法做到(Theta(nlog n))。
我们其实还可以使用二项式反演求到:
一些小小的应用
正常项容斥原理的证明
显然,这里的答案就是至少出现过一次的元素个数,属性集合就是一个元素在哪些集合里面出现过,(g(n)=[nge 1]),于是根据上面的上面的式子求得(f(n)=(-1)^{n+1}),于是我们得证了。
错排问题
显然,这里的答案就是错排个数,属性集合就表示的是哪些位置对应数相同,(g(n))就是([n=0])。于是,我们发现如果我们取(f(x)=(-1)^x)的话,就可以满足:
这个可以使用二项式定理证明。
于是我们的答案就是:
然后如果我们设(f(n))为(n)个点的错排个数的话,根据上面的式子就可以得到一个递推式:
当然还有考虑组合意义的递推公式,但是与主题无关,所以这里就不讲了。