zoukankan      html  css  js  c++  java
  • 「总结」容斥。二.反演原理 5.划分容斥

    参考的(blogs)这篇

    还有具体数学。

    是斯特林反演了。

    首先必要的是两类斯特林数。

    在定义上很重要的区别就是第一类是划分排列,而第二类是划分组合。

    性质上比较重要的就是第一类是将升降幂转化为通常幂,第二类则反之。

    (fr.)第一类斯特林数。

    [left[egin{array}{c}n\kend{array} ight] ]

    (n)个元素划分为(k)个集合,每个集合内圆排列的方案数。

    根据定义,枚举第(n)个元素是处于一个新的集合,还是处于之前某个集合中的某个元素的右侧,可以得到递推式:

    [left[egin{array}{c}n\kend{array} ight]=left[egin{array}{c}n-1\k-1end{array} ight]+(n-1)left[egin{array}{c}n-1\kend{array} ight] ]

    性质1:

    说过了第一类斯特林数是划分排列。

    [sumlimits_{i=0}^{n}left[egin{array}{c}n\iend{array} ight]=n! ]

    证明:排列唯一定义一个轮换,轮换唯一定义一个排列。

    性质上比较重要的就是第一类是将升降幂转化为通常幂,第二类则反之。

    性质2:

    [x^{underline{n}}=sumlimits_{i=0}^{n}(-1)^{n-i}left[egin{array}{c}n\iend{array} ight]x^i ]

    归纳证明:

    [egin{array}{rcl} \ x^{underline{n+1}}&=&(x-n)x^{underline{n}}\&=&xsumlimits_{i=0}^{n}egin{bmatrix}n\i end{bmatrix}(-1)^{n-i}x^{i}-nsumlimits_{i=0}^{n}egin{bmatrix}n\i end{bmatrix}(-1)^{n-i}x^{i}\&=&sumlimits_{i=0}^{n}egin{bmatrix}n\i end{bmatrix}(-1)^{n-i}x^{i+1}+nsumlimits_{i=1}^{n+1}egin{bmatrix}n\i end{bmatrix}(-1)^{n-i+1}x^{i}\&=&sumlimits_{i=1}^{n+1}egin{bmatrix}n\i-1 end{bmatrix}(-1)^{n-i+1}x^{i}+nsumlimits_{i=1}^{n+1}egin{bmatrix}n\i end{bmatrix}(-1)^{n-i+1}x^{i}\&=&sumlimits_{i=1}^{n+1}left(egin{bmatrix}n\i-1 end{bmatrix}+negin{bmatrix}n\i end{bmatrix} ight)(-1)^{n-i+1}x^i\&=&sumlimits_{i=1}^{n+1}egin{bmatrix}n+1\i end{bmatrix}(-1)^{n+1-i}x^i\&=&x^{underline{n+1}}\ end{array} ]

    性质3:

    [x^{overline{n}}=sumlimits_{i=0}^{n}egin{bmatrix}n\iend{bmatrix}x^i ]

    归纳证明:

    [egin{array}{rcl}\x^{overline{n+1}}&=&(x+n)x^{overline{n}}\&=&(x+n)sumlimits_{i=0}^{n}egin{bmatrix}n\iend{bmatrix}x^i\&=&sumlimits_{i=1}^{n+1}egin{bmatrix}n\i-1 end{bmatrix}x^i+nsumlimits_{i=1}^{n+1}egin{bmatrix}n\iend{bmatrix}x^i\&=&sumlimits_{i=1}^{n+1}left(egin{bmatrix}n\i-1end{bmatrix}+negin{bmatrix}n\iend{bmatrix} ight)x^i\&=&sumlimits_{i=1}^{n+1}egin{bmatrix}n+1\iend{bmatrix}x^i\&=&x^{overline{n+1}}\ end{array} ]

    求第一类斯特林数:

    利用性质3:

    设母函数(f(x)^n=x^{underline{n}}=sumlimits_{i=0}^{n}a_ix^i)

    那么求出的(a_i)其实就是一行的第一类斯特林数,考虑倍增(FFT)

    [f(x)^{2n}=f(x)^f(x+n)^n ]

    当我们得到(f(x)^n)的时候考虑如何求出$f(x+n)^n

    [egin{array}{rcl}f(x+n)^n&=&sumlimits_{i=0}^{n}a_i(x+n)^i\&=&sumlimits_{i=0}^{n}a_isumlimits_{j=0}^{i}inom{i}{j}x^j n^{i-j}\&=&sumlimits_{i=0}^{n}x^isumlimits_{j=i}{n}inom{j}{i}a_jn^{j-i}\&=&sumlimits_{i=0}^{n}x^i i!sumlimits_{j=i}{n}frac{j!}{(j-i)!}n^{j-i}a_jend{array} ]

    后面是个卷积,直接(NTT)就完事。

    倍增求解复杂度仍然为(O(nlogn))

    (se.)第二类斯特林数。

    [egin{Bmatrix}n\kend{Bmatrix} ]

    (n)个元素划分为(k)个集合的方案数。

    根据定义,枚举第(n)个元素所在的集合,可以得到递推式:

    [egin{Bmatrix}n\kend{Bmatrix}=egin{Bmatrix}n-1\k-1end{Bmatrix}+kegin{Bmatrix}n-1\kend{Bmatrix} ]

    性质1:

    [k^n=sumlimits_{i=0}^{k}egin{Bmatrix}n\iend{Bmatrix}i!inom{k}{i}=sumlimits_{i=0}^{k}egin{Bmatrix}n\iend{Bmatrix}k^{underline{i}} ]

    我们在(k)个集合中选择(i)个集合放入元素,然后全排列这些集合,得到的就是(n)个元素放入(k)个可空集合的方案数。

    性质2:

    说过了第二类斯特林数是划分组合。

    考虑用组合数来表示斯特林数。

    考虑二项式反演。
    我们一共有(n)个元素和(k)个集合,来模拟划分的过程来满足0个非空这个条件。
    我们设(g(m))为划分中至少(m)个空集合的方案数,(f(m))为恰好有(m)个。

    [g(m)=inom{k}{m}(k-m)^n ]

    [g(m)=sumlimits_{i=m}^{k}inom{k}{i}f(i) ]

    二项式反演得到:

    [f(m)=sumlimits_{i=m}^{k}(-1)^{i-m}inom{k}{i}g(i) ]

    [f(0)=sumlimits_{i=0}^{k}(-1)^iinom{k}{i}(k-i)^m ]

    得到:

    [egin{Bmatrix}n\kend{Bmatrix}=frac{1}{k!}sumlimits_{i=0}^{k}(-1)^iinom{k}{i}(k-i)^n ]

    求第二类斯特林数:

    利用性质2。

    展开:

    [egin{array}{rcl}\ egin{Bmatrix}n\kend{Bmatrix}&=&sumlimits_{i=0}^{k}(-1)^ifrac{1}{k!}frac{k!}{i!(k-i)!}(k-i)^n\&=&sumlimits_{i=0}^{k}(-1)^ifrac{1}{i!}frac{(k-i)^n}{(k-i)!}end{array} ]

    是卷积的形式,那么可以在(O(nlogn))的复杂度内求出第(n)行斯特林数。

    (th.)斯特林反演。

    首先给出结论:

    [f(n)=sumlimits_{i=0}^{n}egin{Bmatrix}n\iend{Bmatrix}g(i) -> g(n)=sumlimits_{i=0}^{n}egin{bmatrix}n\iend{bmatrix}(-1)^{n-i}f(i) ]

    两个引理:

    [x^{underline{n}}=(-1)^n(-x)^{overline{n}} ]

    [x^{overline{n}}=(-1)^n(-x)^{underline{n}} ]

    只证明第一个:

    证明:

    [egin{array}{rcl}x^{underline{n}}&=&(-1)^nprodlimits_{i=0}^{n-1}(-(x-i))\&=&(-1)^n(-1)^nprodlimits_{i=0}^{n-1}(x-i)\&=&x^{underline{n}}end{array} ]

    两个反转公式:

    [sumlimits_{i=m}^{n}egin{bmatrix}n\iend{bmatrix}egin{Bmatrix}i\mend{Bmatrix}=[m=n] ]

    [sumlimits_{i=m}^{n}egin{Bmatrix}n\iend{Bmatrix}egin{bmatrix}i\mend{bmatrix}=[m=n] ]

    反转一证明:

    由第一类斯特林数性质2和第二类斯特林数性质1得到:

    [egin{array}{rcl}x^{underline{n}}&=&sumlimits_{i=0}^{n}(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}x^i\&=&sumlimits_{i=0}^{n}(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}sumlimits_{j=0}^{i}egin{Bmatrix}i\jend{Bmatrix}x^{underline{j}}\ end{array} ]

    更换枚举顺序得到:

    [=sumlimits_{i=0}^{n}x^{underline{i}}sumlimits_{j=i}^{n}(-1)^{n-j}egin{bmatrix}n\iend{bmatrix}egin{Bmatrix}j\iend{Bmatrix} ]

    (f(n,m)=sumlimits_{i=m}^{n}(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}egin{Bmatrix}i\mend{Bmatrix})

    那么:

    [egin{array}{rcl}&=&sumlimits_{i=0}^{n}x^{underline{i}}f(n,i)\&=&x^{underline{n}}\&=&sumlimits_{i=0}^{n}x^{underline{i}}[n=i]end{array} ]

    所以:

    [f(n,m)=[n=m] ]

    (f)和反转公式一是相等的,得证。

    然后反转二证明:

    [x^n=sumlimits_{i=0}^{n}egin{Bmatrix}n\iend{Bmatrix}(-1)^{i}x^{underline{i}} ]

    利用引理二:

    [egin{array}{rcl}&=&sumlimits_{i=0}^{n}egin{Bmatrix}n\iend{Bmatrix}(-1)^isumlimits_{j=0}^{i}egin{bmatrix}i\jend{bmatrix}(-1)^j(x)^j\&=&sumlimits_{i=0}^{n}x^jsumlimits_{j=i}^{n}(-1)^{j-i}egin{Bmatrix}n\jend{Bmatrix}egin{bmatrix}j\iend{bmatrix}end{array} ]

    斯特林反演证明:

    假设:

    [g(n)=sumlimits_{i=0}^{n}(-1)^{n}(-1)^{n-i}egin{bmatrix}n\iend{bmatrix} ]

    [egin{array}{rcl}f(n)&=&sumlimits_{i=0}^{n}[n=i]f(i)\&=&sumlimits_{i=0}^{n}sumlimits_{j=i}^{n}(-1)^{n-j}egin{Bmatrix}n\jend{Bmatrix}egin{bmatrix}j\iend{bmatrix}f(i)\&=&sumlimits_{i=0}^{n}egin{Bmatrix}n\iend{Bmatrix}sumlimits_{j=0}^{i}egin{bmatrix}i\jend{bmatrix}f(i)\&=&sumlimits_{i=0}^{n}egin{Bmatrix}n\iend{Bmatrix}g(i)\ end{array} ]

    另一种至少形式:

    [f(m)=sumlimits_{i=m}^{n}egin{Bmatrix}i\mend{Bmatrix}g(i) -> g(m)=sumlimits_{i=m}^{n}egin{bmatrix}i\mend{bmatrix}(-1)^{i-m}g(i) ]

    (fo.)相互再归的鹅妈妈。

    与其说是斯特林反演不如说是系数构造容斥了。

    根据某个斯特林数的性质设计容斥:

    [x^{underline{n}}=sumlimits_{i=0}^{n}(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}x^i ]

    (x=1)带入。

    [sumlimits_{i=0}^{n}(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}=1^{underline{n}}=[n=1] ]

    因为下降幂再乘就乘到0了。

    设集合(S)(n)个元素,(S)的一种集合划分为(m),记作(min S),(m)中的集合个数称做(k),每个集合的大小称作(a_i)

    考虑第一类斯特林数的意义,其实就是枚举每一种划分,然后将划分中的每个集合排序。

    那么:

    [[n=1]=sumlimits_{min S}(-1)^{n-k}prod{i=1}^{k}(a_i-1)!=sumlimits_{min S}prod{i=1}^{k}(a_i-1)!(-1)^{a_i-1} ]

    这就是题解写的那个式子了,俩月之前还理解不了呢。

    假设我们已经求出可以重复的方案数。

    我们把(n)集合划分,要求相同的数在同一集合,不同的在不同集合。

    对于一个划分方案,我们发现它要满足的条件是:

    [prodlimits_{i=1}^{k}[a_i=1] ]

    也就是各不相同。

    设一个容斥系数(f(m)),总的被计算的方案就是:

    [sumlimits_{min S}f(m)prodlimits_{i=1}^{k}egin{bmatrix}a_i\1end{bmatrix} ]

    要求每个被计算的方案都满足:

    [prodlimits_{i=1}^{k}[a_i=1] ]

    那么:

    [f(m)=(-1)^{n-k} ]

    (dp[i])(i)个人可重复的方案数。

    [ans=sumlimits_{min S}dp[k](-1)^{n-k}prodlimits_{i=1}^{k}egin{bmatrix}a_i\1end{bmatrix}=sumlimits_{min S}dp[k]prodlimits_{i=1}^{k}(a_i-1)!(-1)^{a_i-1} ]

    现在考虑求(dp)数组。

    首先考虑有序方案,最后除去(n!)即可。

    枚举究竟在哪一位某个人开始与(R)不相同,这样得到了的人后面可以乱填,同时只需要留一个人来调和其他不为0的位置即可。

    数位(dp)

    好久以前的题啊,终于还是解决掉了。

  • 相关阅读:
    HDU 1058
    Codeforces 349C
    HDU 2602
    HDU 2571
    HDU 2955
    HDU 2084
    HDU 1003
    HDU 1506 & 1505
    POJ 1854
    HDU 2095
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12036950.html
Copyright © 2011-2022 走看看