斯特林數及斯特林反演

此文章涉及到斯特林數性質及斯特林反演,例題總結與應用篇\(\Longrightarrow\)點這裏html

\({\large\color{SpringGreen}{歷史小芝士}}\)

在組合數學中,斯特林\((Stirling)\)數可指兩類數,第一類斯特林數和第二類斯特林數
這些均由\(18\)世紀數學家\(James Stirling\)提出的,並在著做《\(Methodous Differentialis\)》中首次使用c++

自此,斯特林數成爲又一普遍運用處處理組合問題的一大利器spring

\({\large\color{SpringGreen}{第一類斯特林數}}\)

定義

\(\begin{bmatrix}n\\m \end{bmatrix}\)表示\(n\)個元素分紅\(m\)個環的方案數spa

顯然:\[\begin{bmatrix}n\\m \end{bmatrix}=\begin{bmatrix}n-1\\m-1 \end{bmatrix}+(n-1)*\begin{bmatrix}n-1\\m \end{bmatrix}\]code

理解:考慮從\(n-1\)個元素推過來,若是兩個空環確定是不符合的
\(~~~~~~~~~~\)空一個環則單獨成環,若是\(n-1\)的時候就沒有空環就職意放在一個元素前htm

性質

  • \(n!=\sum\limits_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}\)

理解:其實本質就是置換,一個環則爲一組輪換,每種排列都會對應着惟一 一種置換blog

  • \(x^{\underline n}=\sum\limits_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i}x^i\\\)

概括法:get

\[\begin{aligned}\\ x^{\underline {n+1}}&=(x-n)x^{\underline n}\\ &=(x-n)\sum\limits_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i}x^i\\ &=x\sum\limits_{i=0}^{n} \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i}x^{i}-n\sum\limits_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i} x^i\\ &=\sum\limits_{i=0}^{n} \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i}x^{i+1}-n\sum\limits_{i=0}^{n+1} \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i} x^i\\ &=\sum\limits_{i=1}^{n+1} \begin{bmatrix}n\\i-1 \end{bmatrix}(-1)^{n-i+1}x^{i}+n\sum\limits_{i=0}^{n+1} \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i+1} x^i\\ &=\sum\limits_{i=1}^{n+1} ( \begin{bmatrix}n\\i-1 \end{bmatrix} +n*\begin{bmatrix}n\\i \end{bmatrix})(-1)^{n-i+1}x^{i}\\ &=\sum\limits_{i=1}^{n+1} \begin{bmatrix}n+1\\i \end{bmatrix}(-1)^{n-i+1}x^{i}\\ &=\sum\limits_{i=0}^{(n+1)} \begin{bmatrix}n+1\\i \end{bmatrix}(-1)^{(n+1)-i}x^{i}\\ \end{aligned}\]數學

  • \(x^{\overline n}=\sum_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}x^i\)

證實類上,再也不贅述it

求第一類斯特林數

  • \[\sum_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}x^i=\prod_{i=0}^{n-1}(x+i)\]

\(\begin{array}{c c c}~&0&1&2&3&4\\0&0&0&0&0&0\\1&0&1&0&0&0\\2&0&1&1&0&0\\3&0&2&3&1&0\\4&0&6&11&6&1\end{array}\)

其實把表刷出來就差很少了,能夠理解爲根據\(\begin{bmatrix}n\\m \end{bmatrix}=\begin{bmatrix}n-1\\m-1 \end{bmatrix}+(n-1)*\begin{bmatrix}n-1\\m \end{bmatrix}\)逐漸轉移

至此,咱們能夠經過分治\(FFTO(nlog^2n)\)求出一行的第一類斯特林數

  • 還有一種相似於多項式求逆模式\(O(nlogn)\)的方法
    \[F(x)^n=\prod\limits_{i=0}^{n-1}(x+i),F(x)^{2n}=F(x)^nF(x+n)^n\]

考慮當咱們求出\(F(x)^n=\sum\limits_{i=0}^{n}a_ix^i\)
\[\begin{aligned}\\ F(x+n)^{n}&=\sum\limits_{i=0}^{n}a_i(x+n)^i\\ &=\sum\limits_{i=0}^na_i\sum\limits_{j=0}^i{i\choose j}n^{i-j}x^j\\ &=\sum\limits_{i=0}^n(\sum\limits_{j=i}^n {j\choose i}n^{j-i}a_j)x^i\\ &=\sum\limits_{i=0}^n(\sum\limits_{j=i}^n \frac{j!}{i!(j-i)!}n^{j-i}a_j)x^i\\ &=\sum\limits_{i=0}^n (i!)^{-1}x^i (\sum\limits_{j=i}^n (\frac{n^{j-i}}{(j-i)!})\cdot (j!a_j))\\ \end{aligned}\]
咱們經過左半部分系數能獲得右半部分系數,再相乘一下就獲得了整體的係數

Code

留有少許註釋

#include<bits/stdc++.h>
typedef long long LL;
const LL mod=998244353,g=3,maxn=1e6+9;
inline LL Pow(LL base,LL b){
    LL ret(1);
    while(b){
        if(b&1) ret=ret*base%mod; base=base*base%mod; b>>=1;
    }return ret;
}
LL r[maxn];
inline LL Fir(LL n){
    LL limit(1),len(0);
    while(limit<(n<<1)){
        limit<<=1; ++len;
    }
    for(LL i=0;i<limit;++i) r[i]=(r[i>>1]>>1)|((i&1)<<len-1);
    return limit;
}
inline void NTT(LL *a,LL n,LL type){
    for(LL i=0;i<n;++i) if(i<r[i]) std::swap(a[i],a[r[i]]);
    for(LL mid=1;mid<n;mid<<=1){
        LL wn(Pow(g,(mod-1)/(mid<<1))); if(type==-1) wn=Pow(wn,mod-2);
        for(LL R=mid<<1,j=0;j<n;j+=R)
            for(LL k=0,w=1;k<mid;++k,w=w*wn%mod){
                LL x(a[j+k]),y(w*a[j+mid+k]%mod);
                a[j+k]=(x+y)%mod; a[j+mid+k]=(x-y+mod)%mod;
            }
    }
    if(type==-1){
        LL ty(Pow(n,mod-2)); for(LL i=0;i<n;++i) a[i]=a[i]*ty%mod;
    }
}
LL T[maxn],F[maxn],H[maxn],G[maxn],fac[maxn],fav[maxn],tmp[maxn],sum[maxn],B[maxn];
inline void Mul(LL n,LL *a,LL *b,LL *ans){
    LL limit(Fir(n));
    NTT(a,limit,1); NTT(b,limit,1);
    for(LL i=0;i<limit;++i) ans[i]=a[i]*b[i]%mod;
    NTT(ans,limit,-1);
}
inline void Solve(LL n,LL *a){
    if(!n){ a[0]=1; return; }
    if(n==1){ a[1]=1; return; }
    LL len(n/2);
    Solve(len,a);
    
    LL limit(Fir(len+1));
    for(LL i=0;i<=len;++i) F[i]=Pow(len,i)*fav[i]%mod;
    for(LL i=0;i<=len;++i) H[i]=fac[i]*a[i]%mod;
    for(LL i=0;i<=(len>>1);++i) std::swap(H[i],H[len-i]);
    for(LL i=len+1;i<limit;++i) F[i]=H[i]=0;
    NTT(F,limit,1); NTT(H,limit,1);
    for(LL i=0;i<limit;++i) G[i]=F[i]*H[i]%mod;
    NTT(G,limit,-1);
    for(LL i=0;i<=len;++i) tmp[i]=G[len-i]*Pow(fac[i],mod-2)%mod;//right
    
    Mul(len+1,a,tmp,B);//left * right
    for(LL i=0;i<=(len<<1);++i) a[i]=B[i];
    for(LL i=(len<<1)+1;i<=(len<<2);++i) a[i]=tmp[i]=0;
    
    if(n&1){
        for(LL i=0;i<n;++i) T[i]=a[i];
        for(LL i=1;i<=n;++i) a[i]=(T[i-1]+(n-1)*T[i]%mod)%mod;
    }
}
inline LL Get_c(LL n,LL m){
    return fac[n]*fav[m]%mod*fav[n-m]%mod;
}
LL n;
LL ans[maxn];
int main(){
    scanf("%lld",&n);
    fac[0]=fac[1]=1;
    for(LL i=2;i<=n;++i) fac[i]=fac[i-1]*i%mod;
    fav[n]=Pow(fac[n],mod-2);
    for(LL i=n;i>=1;--i) fav[i-1]=fav[i]*i%mod;
    Solve(n,ans);
    for(LL i=0;i<=n;++i) printf("%lld ",ans[i]);printf("\n");
    return 0;
}

\({\large\color{SpringGreen}{第二類斯特林數}}\)

定義

\(\begin{Bmatrix}n\\m\end{Bmatrix}\)表示\(n\)個有區別的小球丟進\(m\)個無區別的盒子,無空盒子的方案數

顯然:\[\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m*\begin{Bmatrix}n-1\\m\end{Bmatrix}\]

理解:考慮從\(n-1\)個小球推過來,若是兩個空盒子確定是不符合的
\(~~~~~~~~~~\)空一個盒子則只能放到那個空盒子裏面了,若是\(n-1\)的時候就沒有空箱子就隨便放

性質

\[m^n=\sum_{i=0}^{m}\begin{Bmatrix}n\\i\end{Bmatrix}*i!*C(m,i)\]

固然也能夠寫成:\[m^n=\sum\limits_{i=0}^m \begin{Bmatrix}n\\i\end{Bmatrix}*m^{\underline i}\]

到後面反演時咱們會這樣寫:\[m^n=\sum\limits_{i=0}^n \begin{Bmatrix}n\\i\end{Bmatrix}*m^{\underline i}\]
看看後面的\(m^{\underline i}\)就懂了

理解:\(m^n\)\(n\)個有區別的小球丟進\(m\)個有區別的盒子,容許空盒子
\(~~~~~~~~~~\)枚舉有效盒子的個數,再從\(m\)個盒子選\(i\)個盒子,而後\(n\)個小球丟進\(i\)個盒子

轉換到組合表示

第二類斯特林數顯然是和排列組合有關係的,轉換過來:\[\begin{Bmatrix}n\\m\end{Bmatrix}=\frac{1}{m!}\sum\limits_{k=0}^m(-1)^kC(m,k)(m-k)^n\]

理解:若是空箱子的狀況咱們也算進去,答案顯然是\(\frac{m^n}{m!}\)
\(~~~~~~~~~~\)反過來求第二類斯特林數,又得減掉這種狀況:
\(~~~~~~~~~~\)\(k\)個空盒子,而後小球放到其餘的盒子裏
\(~~~~~~~~~~\)但最後咱們求出來的答案爲有區別的盒子,轉換過來要\(×\frac{1}{m!}\)

求第二類斯特林數

大概都能猜到是卷積形式了吧,隨手展開一下:
\[\begin{aligned}\\ \begin{Bmatrix}n\\m\end{Bmatrix}&=\frac{1}{m!}\sum\limits_{k=0}^m(-1)^k\frac{m!}{k!(m-k)!}(m-k)^n\\ &=\sum\limits_{k=0}^m\frac{(-1)^k(m-k)^n}{k!(m-k)!}\\ \end{aligned}\]

至此,咱們能實現\(O(nlogn)\)求出\(S(n)\)這一行的第二類斯特林

第二類斯特林數與天然數冪的關係

\[\begin{aligned}\\ Sum(n)&=\sum\limits_{i=0}^n i^k\\ &=\sum\limits_{i=0}^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j \end{Bmatrix}i^{\underline j}\\ &=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j \end{Bmatrix}\sum\limits_{i=0}^n i^{\underline j}\\ &=\sum\limits_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j!\sum\limits_{i=0}^nC_i^j\\ &=\sum\limits_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix}j!C_{n+1}^{j+1}\\ &=\sum\limits_{j=0}^k \begin{Bmatrix}k\\j \end{Bmatrix} \frac{(n+1)^{\underline {j+1}}}{j+1}\\ \end{aligned}\]

關於\(\sum\limits_{i=0}^nC_i^j=C_{n+1}^{j+1}\)的理解:枚舉\(j+1\)的右端點\(i+1\),則至關於從\(i\)個點中選\(j\)個點

\({\large\color{SpringGreen}{斯特林反演}}\)

定義

斯特林反演:\(f(n)=\sum\limits_{k=0}^n \begin{Bmatrix}n\\k \end{Bmatrix}g(k)\Longleftrightarrow g(n)=\sum\limits_{k=0}^n(-1)^{n-k}\begin {bmatrix} n\\k \end{bmatrix}f(k)\)

總結上面咱們所推倒的性質

  • \(x^{\underline n}=\sum\limits_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n-i}x^i,x^{\overline n}=\sum_{i=0}^n \begin{bmatrix}n\\i \end{bmatrix}x^i\)
  • \(m^n=\sum\limits_{i=0}^n \begin{Bmatrix}n\\i\end{Bmatrix}*m^{\underline i}\)

補充

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

前置

咱們先證這個反轉公式
\[\begin{aligned}\displaystyle \sum_{k=m}^n (-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix} \begin{Bmatrix}k\\m\end{Bmatrix}=[m=n]\\ \sum_{k=m}^n (-1)^{n-k}\begin{Bmatrix}n\\k\end{Bmatrix} \begin{bmatrix}k\\m\end{bmatrix}=[m=n]\end{aligned}\]
反轉公式1
\[\begin{aligned}\\ m^{\underline n}&=\sum\limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}m^i\\ &=\sum\limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}\sum\limits_{j=0}^i \begin{Bmatrix}i\\j\end{Bmatrix}m^{\underline j}\\ &=\sum\limits_{i=0}^n m^{\underline i}\sum\limits_{j=i}^n (-1)^{n-j} \begin{bmatrix}n\\j\end{bmatrix} \begin{Bmatrix}j\\i\end{Bmatrix}\\ \end{aligned}\]
反轉公式2
\[\begin{aligned}\\ m^n&=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}\\ &=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}(-1)^i(-m)^{\overline i}\\ &=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}(-1)^i\sum\limits_{j=0}^i \begin{bmatrix}i\\j\end{bmatrix}(-m)^j\\ &=\sum\limits_{i=0}^n m^i\sum\limits_{j=i}^n(-1)^{i-j} \begin{Bmatrix}n\\j\end{Bmatrix}\begin{bmatrix}j\\i\end{bmatrix}\\ \end{aligned}\]

推式

已知:\(g(n)=\sum\limits_{k=0}^n(-1)^{n-k}\begin {bmatrix} n\\k \end{bmatrix}f(k)\)
\[\begin{aligned}\\ f(n)&=\sum\limits_{k=0}^n [k=n]f(k)\\ &=\sum\limits_{k=0}^n\sum\limits_{j=k}^n \begin {Bmatrix} n\\j \end{Bmatrix}\begin {bmatrix} j\\k \end{bmatrix}(-1)^{j-k}f(k)\\ &=\sum\limits_{k=0}^n \begin {Bmatrix} n\\k \end{Bmatrix}\sum\limits_{j=0}^k (-1)^{k-j}\begin {bmatrix} k\\j \end{bmatrix}f(j)\\ &=\sum\limits_{k=0}^n \begin {Bmatrix} n\\k \end{Bmatrix}g(k)\\ \end{aligned}\]

\({\large\color{SpringGreen}{斯特林數應用}}\)

總結

相關文章
相關標籤/搜索