鞅与停时定理学习笔记

· · 个人记录

鞅与停时定理

更好的阅读体验

离散时间鞅

定义离散时间鞅为一个时间离散的随机过程 \{X_0,X_1,\cdots\},使得 \forall n\in \N,均满足:

根据这个,容易得到 E(X_n)=X_0

停时定理

t 为鞅过程 \{X_0,X_1,\cdots\} 的停时,当下面三个条件之一成立时,有 E(X_t)=X_0

名词解释:

势能函数

对于随机时间序列 \{A_0,A_1,\cdots\}t 为其停时,终止状态为 A_t,求 E(t)

构造势能函数 \Phi(A),满足:

构造序列 X_i=\Phi(A_i)+i,则 E(X_{n+1}-X_n\mid X_0,X_1,\cdots,X_n)=0,即 \{X_0,X_1,\cdots\} 是鞅。

根据停时定理,我们可以得到 E(X_t)=E(X_0),即 E(t)=E(\Phi(A_0))-\Phi(A_t)

例题

CF1025G Company Acquisitions

f(x) 为跟随有 x 个未选中点的选中点的势能函数,整个局面的势能函数为 \Phi(A),每个选中点的势能函数的和。

显然每次操作的势能变化量只和随出来的两个点有关,u,v 的儿子数设为 x,y

为满足 E(\Phi(A_{n+1})-\Phi(A_n)\mid A_0,A_1,\cdots,A_n)=-1,有

f(x)+f(y)-1=\frac{1}{2}(f(x+1)+yf(0))+\frac{1}{2}(f(y+1)+xf(0))

因为我们要对于任意 x,y 成立,所以

f(x)-\frac{1}{2}=\frac{1}{2}f(x+1)+\frac{x}{2}f(0)

f(0)=0,则 f(x)=1-2^x

设停时为 t,注意到 \Phi(A_t)=f(n-1)=1-2^{n-1} 为常数,所以 E(t)=\Phi(A_0)-\Phi(A_t)

#include<cstdio>
int const mod=1e9+7;
int pow(int x,int y){
    int res=1;
    while(y){
        if(y&1) res=1ll*res*x%mod;
        x=1ll*x*x%mod;
        y>>=1;
    }
    return res;
}
int n,c[510],ans;
int main(){
    scanf("%d",&n);
    for(int i=1,x;i<=n;i++){
        scanf("%d",&x);
        if(~x)++c[x];
    }
    for(int i=1;i<=n;i++)ans=(ans+1-pow(2,c[i])+mod)%mod;
    ans=(ans+pow(2,n-1)-1)%mod;
    if(ans<0)ans+=mod;
    printf("%d\n",ans);
    return 0;
} 

CF850F Rainbow Balls

设 $a_{n,i}$ 为 $n$ 次操作后,第 $i$ 个颜色球的个数。 设 $f(x)$ 为有 $x$ 个球的颜色的势能函数,整个局面的势能函数为 $\Phi(A)=\sum f(a_{i})$。 注意到 $E(\Phi(A_{n+1})\mid A_0,A_1,\cdots,A_n)=E(\Phi(A_{n+1})\mid A_n)$,就等于 $$ \sum\limits_i\frac{a_{n,i}(a_{n,i}-1)}{m(m-1)}\sum\limits_{k}f(a_{n,k})+\sum\limits_i\sum\limits_{j\ne i}\frac{a_{n,i}a_{n,j}}{m(m-1)}\left(f(a_{n,i}+1)+f(a_{n,j}-1)+\sum\limits_{k\ne i,k\ne j}f(a_{n,k})\right) $$ 为满足 $E(\Phi(A_{n+1})-\Phi(A_n)\mid A_0,A_1,\cdots,A_n)=-1$,有 $$ \sum\limits_{k}f(a_{n,k})-1=\sum\limits_i\frac{a_{n,i}(a_{n,i}-1)}{m(m-1)}\sum\limits_{k}f(a_{n,k})+\sum\limits_i\sum\limits_{j\ne i}\frac{a_{n,i}a_{n,j}}{m(m-1)}\left(f(a_{n,i}+1)+f(a_{n,j}-1)+\sum\limits_{k\ne i,k\ne j}f(a_{n,k})\right)\\ \sum\limits_{k}f(a_{n,k})-1=\sum\limits_i\frac{a_{n,i}(a_{n,i}-1)}{m(m-1)}\sum\limits_{k}f(a_{n,k})+\sum\limits_i\sum\limits_{j\ne i}\frac{a_{n,i}a_{n,j}}{m(m-1)}\left(f(a_{n,i}+1)+f(a_{n,j}-1)+\sum\limits_{k\ne i,k\ne j}f(a_{n,k})\right)\\ \sum\limits_{k}f(a_{n,k})-1=\sum\limits_i\left(\frac{a_{n,i}(m-a_{n,i})}{m(m-1)}f(a_{n,i}+1)+\frac{a_{n,i}(m-a_{n,i})}{m(m-1)}f(a_{n,i}-1)+(1-\frac{2a_{n,i}(m-a_{n,i})}{m(m-1)})f(a_{n,i})\right)\\ f(x)-\frac{x}{m}=\frac{x(m-x)}{m(m-1)}f(x+1)+\frac{x(m-x)}{m(m-1)}f(x-1)+\frac{2x^2-2mx-m+m^2}{m(m-1)}f(x)\\ f(x+1)=2f(x)-f(x-1)-\frac{m-1}{m-x} $$ 这东西不太好处理,差分一下 $g(x)=f(x)-f(x-1)$。 $$ f(x+1)-2f(x)+f(x-1)=-\frac{m-1}{m-x}\\ g(x+1)-g(x)=-\frac{m-1}{m-x}\\ g(x+1)=g(x)-\frac{m-1}{m-x}\\ g(x)=g(0)-\sum\limits_{i=0}^{x-1}\frac{m-1}{m-i}\\ f(x)=f(0)+\sum\limits_{i=1}^xg(i)\\ f(x)=f(0)+\sum\limits_{i=1}^x(g(0)-\sum\limits_{j=0}^{i-1}\frac{m-1}{m-j})\\ f(x)=f(0)+xg(0)-\sum\limits_{i=1}^x\sum\limits_{j=0}^{i-1}\frac{m-1}{m-j}\\ f(x)=f(0)+xg(0)-\sum\limits_{j=0}^{x-1}(x-j)\frac{m-1}{m-j}\\ f(x)=f(0)+xg(0)-(m-1)\sum\limits_{j=0}^{x-1}(\frac{x-m}{m-j}-1)\\ f(x)=f(0)+xg(0)+(m-1)(m-x)\sum\limits_{j=0}^{x-1}\frac{1}{m-j}-x(m-1)\\ $$ 取 $f(0)=0,g(0)=m-1$,则 $f(x)=(m-1)(m-x)\sum\limits_{i=0}^{x-1}\frac{1}{m-i}$。 设停时为 $t$,则 $\Phi(A_t)=f(m)+(n-1)f(0)=0$,为常数,所以 $E(t)=\Phi(A_0)-\Phi(A_t)$。 ```cpp #include<cstdio> int const mod=1e9+7; int n,a[2510],f[100010],m,ans; int pow(int x,int y){ int res=1; while(y){ if(y&1)res=1ll*res*x%mod; x=1ll*x*x%mod,y>>=1; } return res; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",a+i),m+=a[i]; f[0]=0; for(int i=1;i<=100000;i++) f[i]=(f[i-1]+pow(m-i+1,mod-2))%mod; for(int i=1;i<=100000;i++) f[i]=1ll*(m-1)*(m-i)%mod*f[i]%mod; for(int i=1;i<=n;i++)ans=(ans+f[a[i]])%mod; printf("%d\n",ans); return 0; } ``` ### [CF1349D Slime and Biscuits](https://www.luogu.com.cn/problem/CF1349D) 设 $a_{n,i}$ 为 $n$ 步后第 $i$ 个人的饼干数量。 设 $f(x)$ 为有 $x$ 个饼干的人的势能函数,整个局面的势能函数为 $\Phi(A)=\sum f(a_{_i})$。 注意到 $E(\Phi(A_{n+1})\mid A_0,A_1,\cdots,A_n)=E(\Phi(A_{n+1})\mid A_n)$。 $$ E(\Phi(A_{n+1})\mid A_n)=\sum\limits_i\sum\limits_{j\ne i}\frac{a_{n,i}}{m(n-1)}\left(f(a_{n,i}-1)+f(a_{n,j}+1)+\sum\limits_{k\ne i,k\ne j}f(a_{n,k})\right)\\ $$ 为满足 $E(\Phi(A_{n+1})-\Phi(A_n)\mid A_0,A_1,\cdots,A_n)=-1$,有 $$ \begin{aligned} \sum\limits_{k}f(a_{n,k})-1&=\sum\limits_i\sum\limits_{j\ne i}\frac{a_{n,i}}{m(n-1)}\left(f(a_{n,i}-1)+f(a_{n,j}+1)+\sum\limits_{k\ne i,k\ne j}f(a_{n,k})\right)\\ \sum\limits_{k}f(a_{n,k})-1&=\sum_i\left(\frac{a_{n,i}}{m}f(a_{n,i}-1)+\frac{m-a_{n,i}}{m(n-1)}f(a_{n,i}+1)+\frac{(m-a_{n,i})(n-2)}{m(n-1)}f(a_{n,i})\right)\\ f(x)-\frac{x}{m}&=\frac{x}{m}f(x-1)+\frac{m-x}{m(n-1)}f(x+1)+\frac{(m-x)(n-2)}{m(n-1)}f(x)\\ f(x+1)&=\left(\frac{m(n-1)}{m-x}-(n-2)\right)f(x)-\frac{(n-1)x}{m-x}f(x-1)-\frac{(n-1)x}{m-x} \end{aligned} $$ 将 $x=0$ 代入可得 $f(1)=f(0)$,所以取 $f(0)=f(1)=0$。 设停时为 $t$,则 $\Phi(A_t)=f(m)+(n-1)f(0)$,为常数,所以 $E(t)=\Phi(A_0)-\Phi(A_t)$。 ```cpp #include<cstdio> int const mod=998244353; int pow(int x,int y){ int res=1; while(y){ if(y&1)res=1ll*res*x%mod; x=1ll*x*x%mod,y>>=1; } return res; } int f[300010],n,m,a[100010],ans; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",a+i),m+=a[i]; for(int i=1;i<300000;i++){ f[i+1]=(1ll*m*(n-1)%mod*pow(m-i,mod-2)%mod-n+2ll+mod)%mod*f[i]%mod; f[i+1]=(f[i+1]-1ll*(n-1)*i%mod*pow(m-i,mod-2)%mod*(f[i-1]+1)%mod+mod)%mod; } for(int i=1;i<=n;i++)ans=(ans+f[a[i]])%mod; ans=(ans-f[m]+mod)%mod; printf("%d\n",ans); return 0; } ``` ### [CF1479E School Clubs](https://www.luogu.com.cn/problem/solution/CF1479E) 套路设出一个状态的势能函数 $\phi(A)$ 为每组的势能相加 $\sum f(a_i)$。 容易注意到 $f(0)=0$。 为满足$E(\Phi(A_{n+1})-\Phi(A_n)\mid A_0,A_1,\cdots,A_n)=-1$,有 $$ \phi(A_t)-1=\phi(A_{t+1})\\ \sum_i\frac {a_i}n(\frac 12(\phi(A_t)-f(a_i)+f(a_i-1)+f(1))+\frac{a_i}{2n}\phi(A_t)+\sum_{j\ne i}\frac {a_j}{2n}(\phi(A_t)-f(a_i)-f(a_j)+f(a_i-1)+f(a_j+1)))\\ -1=\sum_i\frac {a_i}{2n}(-f(a_i)+f(a_i-1)+f(1)+\sum_{j\ne i}\frac {a_j}{n}(-f(a_i)-f(a_j)+f(a_i-1)+f(a_j+1)))\\ -1=-\sum_i\frac {a_i}{2n}f(a_i)+\sum_i\frac {a_i}{2n}f(a_i-1)+\sum_i\frac {a_i}{2n}f(1)-\sum_i\frac {a_i}{2n}\sum_{j\ne i}\frac {a_j}{n}f(a_i)-\sum_i\frac {a_i}{2n}\sum_{j\ne i}\frac {a_j}{n}f(a_j)+\sum_i\frac {a_i}{2n}\sum_{j\ne i}\frac {a_j}{n}f(a_i-1)+\sum_i\frac {a_i}{2n}\sum_{j\ne i}\frac {a_j}{n}f(a_j+1)\\ $$ $$ -\sum_i\frac{a_i}n=\sum_i\frac {a_i}{2n}f(1)-\sum_i\frac {3na_i-2a^2_i}{2n^2}f(a_i)+\sum_i\frac {2na_i-a^2_i}{2n^2}f(a_i-1)+\sum_i\frac {na_i-a^2_i}{2n^2}f(a_i+1) \\ -\frac xn=\frac x{2n}f(1)-\frac{3nx-2x^2}{2n^2}f(x)+\frac{2nx-x^2}{2n^2}f(x-1)+\frac{nx-x^2}{2n^2}f(x+1)\\ $$ 设 $f(1)=-2$。 $$ 0=-\frac{3nx-2x^2}{2n^2}f(x)+\frac{2nx-x^2}{2n^2}f(x-1)+\frac{nx-x^2}{2n^2}f(x+1)\\ f(x+1)=\frac {2n^2}{nx-x^2}(\frac{3nx-2x^2}{2n^2}f(x)-\frac{2nx-x^2}{2n^2}f(x-1))\\ f(x+1)=\frac{3n-2x}{n-x}f(x)-\frac{2n-x}{n-x}f(x-1)\\ f(x+1)=\frac{3n-2x}{n-x}\frac{d_1}{d_2}-\frac{2n-x}{n-x}\frac{s_1}{s_2}\\ f(x+1)=\frac{(3n-2x)d_1}{(n-x)d_2}-\frac{(2n-x)s_1}{(n-x)s_2}\\ f(x+1)=\frac{(3n-2x)d_1s_2-(2n-x)s_1d_2}{(n-x)d_2s_2} $$ 容易发现此时的 $E(A_t)=f(n)$ 为常数,答案即为 $\sum f(a_i)-f(n)$。 线性算即可,可以过,记得开 C++17(64)。 ```cpp #include<cstdio> #include<algorithm> int const mod=998244353; int pow(int x,int y){ int res=1; while(y){ if(y&1) res=1ll*res*x%mod; x=1ll*x*x%mod,y>>=1; } return res; } int n,m,a[1010]; int main(){ scanf("%d",&m); for(int i=1;i<=m;i++)scanf("%d",a+i),n+=a[i]; std::sort(a+1,a+m+1); int ans=0; int s1=0,d1=mod-2,s2=1,d2=1,p1,p2,j=1; while(j<=m&&a[j]==1)ans=(ans+mod-2)%mod,++j; for(int i=1;i<n;i++){ p2=1ll*(n-i)*d2%mod*s2%mod; p1=((3ll*n-2*i)*d1%mod*s2+(mod-1ll)*(2*n-i)%mod*s1%mod*d2)%mod; while(j<=m&&a[j]==i+1)ans=(ans+1ll*p1*pow(p2,mod-2))%mod,++j; s1=d1,s2=d2,d1=p1,d2=p2; } printf("%lld\n",(ans+(mod-1ll)*d1%mod*pow(d2,mod-2))%mod); return 0; } ``` CF 题解给出的做法是将下面的式子用多项式科技优化。 $$ g(x)=f(x+1)-f(x)\\ g(x)=\frac{2n-x}{n-x}g(x-1)\\ g(x)=g(0)\prod_{i=1}^x\frac{2n-i}{n-i}\\ f(x)=-2\sum_{i=0}^{x-1}\prod_{j=1}^i\frac{2n-j}{n-j} $$