[atAGC053F]ESPers

记$Y$为在最后一次两者票数相同前投票的ESPer数量除以$K$,不难得到答案即$1-\frac{E(Y)}{2}$,问题也即求$E(Y)$

为了方便叙述,称$S$为一种方案$,P_{S}$和$Y_{S}$分别为$S$的发生概率和$Y$,显然$E(Y)=\sum_{S}P_{S}Y_{S}$

对于一个$S$,再构造序列$\{a_{i}\}$,规则如下:

1.若第$i$次投票投给票数(严格)较多的一方或投票者是ESPer,则选择$a_{i}=1$

2.若第$i$次投票投给票数(严格)较少的一方,则选择$a_{i}=-1$

3.若不为上述情况(票数相同且投票者不是ESPer),则等概率选择$a_{i}=\pm 1$

记$Q_{S,a}$为$S$得到$\{a_{i}\}$的概率,显然$\forall S,\sum_{a}Q_{S,a}=1$,代入即
$$
E(Y)=\sum_{S}Y_{S}P_{S}\sum_{a}Q_{S,a}=\sum_{a}\sum_{S}Y_{S}P_{S}Q_{S,a}
$$
换言之,考虑确定$\{a_{i}\}$后如何求出后者——

将$\{a_{i}\}$表示成形如$S_{0},-1,S_{1},-1,...,S_{x},1,S_{x+1},1,...,S_{x+y}$的形式(其中$S_{i}$总和为0且任意前缀和非负、允许为空),注意到每次只能不断取最长的$S_{i}$,即形式是唯一的

进一步的,注意到以下性质:

1.ESPer恰可以出现在所有为1的位置,而每一个$S_{i}$中恰有一半是1

2.其余人投票时若票数不同,会对$P_{S}$有$\frac{1}{2}$的贡献,否则会对$Q_{S,a}$有$\frac{1}{2}$的贡献,总贡献即$\frac{1}{2^{2n+1-K}}$

3.最后一次出现两者票数相同发生在$E_{x}$($x$是偶数)或$E_{x-1}$($x$是奇数)的末尾

综上,不难得到后者即
$$
\frac{\frac{2n+1-x+y}{2}\choose {K}}{(2n+1-x+y){2n+1\choose K}2^{2n+1-K}}\times \begin{cases}\sum_{i=0}^{x}|S_{i}|&x\equiv 0(mod\ 2)\\\sum_{i=0}^{x-1}|S_{i}|&x\equiv 1(mod\ 2)\end{cases}
$$
同时,$S_{i}$之间其实是等价的(可以任意排列),因此对于所有$S_{i}$上式期望是
$$
\frac{(2n+1-x-y){\frac{2n+1-x+y}{2}\choose {K}}}{(2n+1-x+y){2n+1\choose K}2^{2n+1-K}}\times\begin{cases}\frac{x+1}{x+y+1}&x\equiv 0(mod\ 2)\\\frac{x}{x+y+1}&x\equiv 1(mod\ 2)\end{cases}
$$
接下来,考虑$S_{i}$的方案数,在相邻两个$S_{i}$之间补上一个1,方案即对应于从$(0,0)$到$(2n+1,x+y)$的路径(形式参考卡特兰数),同时在路径中不断选最后一次与$y=0,1,...,x+y$有交的位置也可以对应于$S_{i}$

参考卡特兰数的推导,可得$S_{i}$的方案数即${2n+1\choose \frac{2n+1-x-y}{2}}-{2n+1\choose \frac{2n-1-x-y}{2}}$

综上,确定$x,y$​即可统计贡献,进而最终答案即
$$
\frac{1}{{2n+1\choose K}2^{2n+1-K}}\sum_{x\equiv 0(mod\ 2),y\equiv 1(mod\ 2)}\frac{(x+1)(n-k){\frac{2n+1-x+y}{2}\choose {K}}}{(k+1)(2n+1-x+y)}\left({2n+1\choose n-k}-{2n+1\choose n-k-1}\right)
$$

$$
\frac{1}{{2n+1\choose K}2^{2n+1-K}}\sum_{x\equiv 1(mod\ 2),y\equiv 0(mod\ 2)}\frac{x(n-k){\frac{2n+1-x+y}{2}\choose {K}}}{(k+1)(2n+1-x+y)}\left({2n+1\choose n-k}-{2n+1\choose n-k-1}\right)
$$

(其中$k=\frac{x+y-1}{2}$,显然是整数)

暴力计算复杂度为$o(n^{2})$,注意到两者是类似地,不妨仅优化前者

具体的,改为枚举$k$和$x$并将$y=2k+1-x$​代入,即
$$
\frac{1}{{2n+1\choose K}2^{2n+1-K}}\sum_{k=0}^{n}\frac{(n-k)\left({2n+1\choose n-k}-{2n+1\choose n-k-1}\right)}{k+1}\sum_{x\le 2k+1,x\equiv 0(mod\ 2)}\frac{(x+1){n+k-x+1\choose {K}}}{2(n+k-x+1)}
$$
将${n+k-x+1\choose K}$变形为$\frac{n+k-x+1}{K}{n+k-x\choose K-1}$,进而关于$x$的枚举即
$$
\frac{1}{2K}\sum_{x\le 2k+1,x\equiv 0(mod\ 2)}(x+1){n+k-x\choose {K-1}}
$$
观察后者,不难发现维护${n\choose K-1}$中$n$(奇数项/偶数项)(乘$n$/不乘$n$)的前缀和即可$o(1)$求出

时间复杂度为$o(n)$,可以通过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 4000005
 4 #define mod 1000000007
 5 #define ll long long
 6 int n,m,K,ans,fac[N],inv[N],Inv[N],sum[N],Sum[N];
 7 int C(int n,int m){
 8     if ((m<0)||(n<m))return 0;
 9     return (ll)fac[n]*Inv[m]%mod*Inv[n-m]%mod;
10 }
11 int get_sum(int l,int r){
12     if (l<2)return sum[r];
13     return (sum[r]-sum[l-2]+mod)%mod;
14 }
15 int get_Sum(int l,int r){
16     if (l<2)return Sum[r];
17     return (Sum[r]-Sum[l-2]+mod)%mod;
18 }
19 int main(){
20     fac[0]=inv[0]=inv[1]=Inv[0]=1;
21     for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
22     for(int i=1;i<N;i++){
23         fac[i]=(ll)fac[i-1]*i%mod;
24         Inv[i]=(ll)Inv[i-1]*inv[i]%mod;
25     }
26     scanf("%d%d",&n,&K),m=(n<<1)+1;
27     for(int i=0;i<N;i++){
28         sum[i]=C(i,K-1),Sum[i]=(ll)i*sum[i]%mod;
29         if (i>1){
30             sum[i]=(sum[i]+sum[i-2])%mod;
31             Sum[i]=(Sum[i]+Sum[i-2])%mod;
32         }
33     }
34     for(int k=0;k<=n;k++){
35         int s=0;
36         s=(s+(ll)(n+k+1)*get_sum(n-k,n+k)-get_Sum(n-k,n+k)+mod)%mod;
37         s=(s+(ll)(n+k)*get_sum(n-k-1,n+k-1)-get_Sum(n-k-1,n+k-1)+mod)%mod;
38         s=(ll)s*inv[K]%mod*(mod+1>>1)%mod;
39         ans=(ans+(ll)s*(n-k)%mod*(C(m,n-k)-C(m,n-k-1)+mod)%mod*inv[k+1])%mod;
40     }
41     ans=(ll)ans*Inv[m]%mod*fac[K]%mod*fac[m-K]%mod;
42     for(int i=0;i<m-K;i++)ans=(ll)(mod+1>>1)*ans%mod;
43     ans=(mod+1-(ll)(mod+1>>1)*ans%mod)%mod;
44     printf("%d\n",ans);
45     return 0; 
46 } 
View Code

 

posted @ 2021-12-30 11:01  PYWBKTDA  阅读(104)  评论(0编辑  收藏  举报