下降幂、斯特林数学习笔记

下降幂

注:这里其实还有上升幂。

定义

下降幂:\(x^{\underline{k}}=\prod\limits_{i=x-k+1}^xi=\frac{x!}{(x-k)!}\)
上升幂:\(x^{\overline{k}}=\prod\limits_{i=x}^{x+k-1}i=\frac{(x+k-1)!}{(x-1)!}\)

性质

幂相加:

\[n^{\underline{a+b}}=n^{\underline a}(n-a)^{\underline b} \]

\[n^{\overline{a+b}}=n^{\overline a}(n+a)^{\overline b} \]

上升幂、下降幂转化:

\[n^{\underline m}=(-1)^m(-n)^{{\overline m}}=(n-m+1)^{\overline m} \]

\[n^{\overline m}=(-1)^m(-n)^{\underline m}=(n+m-1)^{\underline m} \]

组合数、下降幂转化:

\[\binom nm=\frac{n!}{m!(n-m)!}=\frac{n^{\underline m}}{m!} \]

组合数转换:

\[\binom nm=\frac{n^{\underline m}}{m!}=\frac{(-1)^m(-n)^{\overline m}}{m!}=(-1)^m\frac{(m-n-1)^{\underline m}}{m!}=(-1)^m\binom{m-n-1}m \]

下降幂、组合数相乘:

\[\binom nkk^{\underline i}=\frac{n!}{k!(n-k)!}\frac{k!}{(k-i)!}=\frac{(n-i)!}{(n-k)!(k-i)!}\frac{n!}{(n-i)!}=\binom{n-i}{k-i}n^{\underline i} \]

普通幂的牛顿二项式定理和下降幂、上升幂的二项式定理:

\[r\in \mathbb{R},\binom ri=\frac{r^{\underline i}}{i!} \]

\[(x+y)^r=\sum_{i\ge 0}\binom rix^iy^{r-i} \]

\[(x+y)^{\underline n}=\sum_{i\ge 0}\binom nix^{\underline i}y^{\underline{n-i}} \]

\[(x+y)^{\overline m}=\sum_{i\ge 0}\binom nix^{\overline i}y^{\overline{n-i}} \]

在微积分中的运用

大坑待补……

斯特林数

第二类斯特林数

定义

定义 \(\begin{Bmatrix}n\\m\end{Bmatrix}\) 表示将 \(n\) 个数分到 \(m\) 个两两相同的集合中的方案数。我们称他为第二类斯特林数。

递推公式

考虑我们新加入一个数产生的贡献。

  1. 放入一个新的集合。那么原先就有 \(m-1\) 个集合,产生 \(\begin{Bmatrix}n-1\\m-1\end{Bmatrix}\) 的贡献。
  2. 放入原先的 \(m\) 个集合中。那么有 \(m\) 种可能的方法,产生 \(m\begin{Bmatrix}n-1\\m\end{Bmatrix}\) 的贡献。

所以 \(\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begin{Bmatrix}n-1\\m\end{Bmatrix}\)

通项公式

考虑容斥。由于两两相同的集合并不好处理,因此我们先让集合两两不同,最后再将算出的答案 \(\times\frac 1{k!}\) 即可。

\(f(x)\) 表示至少有 \(x\) 个空集合的情况,则有:

\[f(x)=\binom mx(m-x)^n \]

\(g(x)\) 表示恰好有 \(x\) 个空集合的情况,则有:

\[g(x)=\sum_{i\ge x}(-1)^{i-x}\binom ixf(i) \]

容易发现 \(\begin{Bmatrix}n\\m\end{Bmatrix}=\dfrac{g(0)}{m!}\),则有:

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\frac 1{m!}\sum_{i=0}^m(-1)^i\binom i0f(i) \]

\[=\frac 1{m!}\sum_{i=0}^m(-1)^i\binom mi(m-i)^n \]

\[=\sum_{i=0}^m\frac{(-1)^i(m-i)^n}{i!(m-i)!} \]

性质

普通幂转上升幂:

\[x^n=\sum_{k\ge 0}\begin{Bmatrix}n\\k\end{Bmatrix}(-1)^{n-k}x^{\overline k} \]

普通幂转下降幂:

\[x^n=\sum_{k\ge 0}\begin{Bmatrix}n\\k\end{Bmatrix}x^{\underline k} \]

通常第二种情形在组合数学中更常用,经常与 \(\binom nkk^{\underline i}=\binom{n-i}{k-i}n^{\underline i}\) 配套使用,用来提出下降幂。

第二类斯特林数·行

斯特林数中,一行指数的数量相同,一列指集合或圆排列数量相同。
对于第二类斯特林数·行这个问题,当然可以使用递推式 \(O(n^2)\) 求解,但是太慢了,考虑 NTT。

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\sum_{i=0}^m\frac{(-1)^i(m-i)^n}{i!(m-i)!} \]

\[=\sum_{i=0}^m\frac{(-1)^i}{i!}\frac{(m-i)^n}{(m-i)!} \]

一眼 NTT 经典形态,\(O(n\log n)\) 光速解决。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e5+5,p=167772161;
namespace NTT{
    int rev[N],mx,k,qp;
    struct dft{int fg[N];};
    int qpow(int x,int y){
        int re=1;
        while(y){
            if(y&1) re=re*x%p;
            x=x*x%p,y>>=1;
        }return re;
    }void init(int n){
        mx=1,k=0,rev[0]=0;
        while(mx<=n) mx*=2,k++;
        for(int i=0;i<mx;i++)
            rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
        qp=qpow(mx,p-2);
    }void ntt(dft &a,int fl){
        for(int i=0;i<mx;i++)
            if(i<rev[i]) swap(a.fg[i],a.fg[rev[i]]);
        for(int i=1;i<mx;i*=2){
            int om=qpow(fl?3:(p+1)/3,(p-1)/(i<<1));
            for(int j=0,w=1;j<mx;j+=i*2,w=1)
                for(int k=j;k<j+i;k++,w=w*om%p){
                    int x=a.fg[k],y=w*a.fg[k+i]%p;
                    a.fg[k]=(x+y)%p,a.fg[k+i]=(x-y+p)%p;
                }
        }if(fl) return;
        for(int i=0;i<mx;i++)
            a.fg[i]=a.fg[i]*qp%p;
    }
}using namespace NTT;
int n;dft f,g;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n,init(n*2+1);
    for(int i=0,jc=1;i<=n;i++,jc=jc*i%p){
        f.fg[i]=(1-i%2*2)*qpow(jc,p-2);
        g.fg[i]=qpow(i,n)*qpow(jc,p-2)%p;
    }ntt(f,1),ntt(g,1);
    for(int i=0;i<mx;i++)
        f.fg[i]=f.fg[i]*g.fg[i]%p;
    ntt(f,0);
    for(int i=0;i<=n;i++)
        cout<<f.fg[i]<<" ";
    return 0;
}

第二类斯特林数·列

大坑待补……

第一类斯特林数

注:第一类斯特林数没有实用的通项公式。

定义

定义 \(\begin{bmatrix}n\\m\end{bmatrix}\) 表示将 \(n\) 个数分到 \(m\) 个两两相同的圆排列中的方案数。我们称他为第一类斯特林数。

递推公式

考虑我们新加入一个数产生的贡献。

  1. 放入一个新的圆排列。那么原先就有 \(m-1\) 个圆排列,产生 \(\begin{bmatrix}n-1\\m-1\end{bmatrix}\) 的贡献。
  2. 放入原先的 \(m\) 个集合中。那么有 \(n-1\) 种可能的方法,产生 \((n-1)\begin{bmatrix}n-1\\m\end{bmatrix}\) 的贡献。

所以 \(\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\m\end{bmatrix}\)

性质

上升幂转普通幂:

\[x^{\overline m}=\sum_{k\ge 0}\begin{bmatrix}n\\k\end{bmatrix}x^k \]

下降幂转普通幂:

\[x^{\underline n}=\sum_{k\ge 0}\begin{bmatrix}n\\k\end{bmatrix}(-1)^{n-k}x^k \]

第一类斯特林数·行

大坑待补……

第一类斯特林数·列

大坑待补……

斯特林反演

先放公式:

\[f(n)=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^i\begin{bmatrix}n\\i\end{bmatrix}f(i) \]

\[f(n)=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^i\begin{Bmatrix}n\\i\end{Bmatrix}f(i) \]

两个证明相似,这里只证明第一个。考虑:

\[m^n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}m^{{\underline i}} \]

\[=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\sum_{j=0}^i(-1)^{i-j}\begin{bmatrix}i\\j\end{bmatrix}m^j \]

\[=\sum_{i=0}^nm^i\sum_{j=i}^n(-1)^{j-i}\begin{bmatrix}j\\i\end{bmatrix}\begin{Bmatrix}n\\i\end{Bmatrix} \]

由于等式两端恒等,所以满足:

\[\sum_{i=m}^n(-1)^{i-m}\begin{bmatrix}i\\m\end{bmatrix}\begin{Bmatrix}n\\i\end{Bmatrix}=[m=n] \]

假如我们分解的是 \(m^{\underline n}\),那么会有:

\[\sum_{i=m}^n(-1)^{i-m}\begin{Bmatrix}i\\m\end{Bmatrix}\begin{bmatrix}n\\i\end{bmatrix}=[m=n] \]

现在我们就可以开始证明反演公式了:

\[f(n)=\sum_{i=0}^n[i=n]f(i) \]

\[=\sum_{i=0}^nf(i)\sum_{j=i}^n(-1)^{j-i}\begin{Bmatrix}n\\j\end{Bmatrix}\begin{bmatrix}j\\i\end{bmatrix} \]

\[=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\sum_{j=0}^i(-1)^{i-j}\begin{bmatrix}i\\j\end{bmatrix}f(j) \]

\(g(n)=\sum\limits_{i=0}^n(-1)^i\begin{bmatrix}n\\i\end{bmatrix}f(i)\) 时,有:

\[f(n)=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g(i) \]

那我们就完成了右到左的推导。假如 \(f(n)=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g(i)\) 的话,那么有:

\[\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g(i)=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\sum_{j=0}^i(-1)^{i-j}\begin{bmatrix}i\\j\end{bmatrix}f(j) \]

\[g(i)=\sum_{j=0}^i(-1)^{i-j}\begin{bmatrix}i\\j\end{bmatrix}f(j) \]

换元就和上面一样了。
另外一个公式也差不多,于是我们就证明了斯特林反演公式:

\[f(n)=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^i\begin{bmatrix}n\\i\end{bmatrix}f(i) \]

\[f(n)=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^i\begin{Bmatrix}n\\i\end{Bmatrix}f(i) \]

posted @   长安一片月_22  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示