(以下修改指1和2类操作,询问指3类操作,操作指修改或询问)
注意到总方案数确定,那么不妨求出答案的期望,再乘上方案数即为答案
(这里从期望的角度考虑只是为了描述方便,并没有太大的实际意义)
设$E(t)$为对某一个位置执行$t$次修改(指对该点)后该位置的期望,通过概率去求,即设$P(t,i)$表示经过$t$次修改后为$i$的概率,那么$E(t)=sum_{i=0}^{m-1}icdot P(t,i)$
初始有$P(0,0)=1$,接下来有$P(t,i)=frac{sum_{j=0}^{m-1}P(t,i)+mP(t-1,i)}{2m}=frac{1}{2m}+frac{P(t-1,i)}{2}=frac{1}{m}-frac{1}{m2^{t}}$($P(t,0)$系数为0,可以不考虑),代入$E(t)$,即可得$E(t)=sum_{i=1}^{m-1}frac{i}{m}-frac{i}{m2^{t}}=(1-frac{1}{2^{t}})frac{m-1}{2}$
记$p_{i}=frac{i(n-i+1)}{n+1choose 2}$,即第$i$个位置被操作区间包含的概率,那么当经过$t$次修改(指全局)后,即可得第$i$个位置的期望为$h_{t,i}=frac{m-1}{2}sum_{j=0}^{t}{tchoose j}p_{i}^{j}(1-p_{i})^{t-j}(1-frac{1}{2^{j}})=frac{m-1}{2}(1-(1-frac{p_{i}}{2})^{t})$(二项式定理合并)
(为了方便,以下记$P=1-frac{p_{i}}{2}$,即$h_{t,i}=frac{m-1}{2}(1-P^{t})$)
再加入查询,即经过$t$次操作后第$i$个位置的期望$g_{t,i}=frac{sum_{j=0}^{t}{tchoose j}(2m)^{j}h_{j,i}}{(2m+1)^{t}}$(枚举修改次数),将$h_{t,i}$代入后并化简,即可得$g_{t,i}=frac{m-1}{2}(1-(frac{2mP+1}{2m+1})^{t})$
考虑第$i$个位置对答案的贡献的期望,即$f_{i}=frac{p_{i}}{2m+1}sum_{j=1}^{q}g_{j-1,i}$(枚举产生贡献的操作编号,需要是询问且包含$i$),同样即可得$f_{i}=frac{p_{i}(m-1)}{2(2m+1)}(q-S(frac{2mP+1}{2m+1}))$(其中$S(k)=sum_{i=0}^{q-1}k^{i}=frac{k^{q}-1}{k-1}$)
最终答案即为$sum_{i=1}^{n}f_{i}$,时间复杂度由于快速幂,需要$o(nlog_{2}n)$

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mod 998244353 4 int n,m,q,ans; 5 int ksm(int n,int m){ 6 int s=n,ans=1; 7 while (m){ 8 if (m&1)ans=1LL*ans*s%mod; 9 s=1LL*s*s%mod; 10 m>>=1; 11 } 12 return ans; 13 } 14 int inv(int k){ 15 return ksm(k,mod-2); 16 } 17 int S(int k){ 18 if (k==1)return q; 19 return 1LL*(ksm(k,q)+mod-1)*inv(k-1)%mod; 20 } 21 int main(){ 22 scanf("%d%d%d",&n,&m,&q); 23 int s=inv(2*m+1); 24 for(int i=1;i<=n;i++){ 25 int p=1LL*i*(n-i+1)%mod*inv(n)%mod*inv(n+1)%mod; 26 int P=mod+1-p,ss=S((2LL*m*P+1)%mod*s%mod); 27 ans=(ans+1LL*p*(m-1)%mod*s%mod*(q+mod-ss))%mod; 28 } 29 s=1LL*n*(n+1)/2%mod*(m+m+1)%mod; 30 ans=1LL*ans*ksm(s,q)%mod; 31 printf("%d",ans); 32 }