zoukankan      html  css  js  c++  java
  • [atARC111F]Do you like query problems

    (以下修改指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 }
    View Code
  • 相关阅读:
    MySQL 数据库报错 Too many connections
    C# 字符串倒序输出
    C# Guid.NewGuid()
    C# MongoDB 查询所有集合名
    MongoDB 错误be UuidLegacy, not UuidStandard
    jstree 反选,测试400条数据左右有点卡
    js Date对象日期格式化
    敏捷开发-Scrum
    linux centos7 和 windows下 部署 .net core 2.0 web应用
    部署SSL站点 IIS+asp.net
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/14311601.html
Copyright © 2011-2022 走看看