zoukankan      html  css  js  c++  java
  • [组合数学]Yes or No

    原文链接

    https://blog.csdn.net/wxh010910/article/details/77752687

    题意

    (n+m)个询问,其中(n)个是YES,(m)个是NO,你回答一个问题之后会知道这个问题的答案,求最优策略下你期望对多少个。

    题解

    显然最优策略是回答多的那个。
    不妨设(n geq m),将正确答案画在二维平面上,发现是((n,m))((0,0))的一条路径。
    画一条对角线(y=x),我们发现如果路径不经过对角线那么答案就是(n)
    我们考虑计算答案的增量,发现在对角线处才会贡献有(frac{1}{2})的概率贡献(1)的增量,所以答案是
    (n+frac{sum^{m}_{i=1}{2i choose i}{n+m-2i choose n-i}}{2{n+m choose n}})

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=998244353;
    
    ll f[1000005],invf[1000005];
    
    ll qpow(ll a,ll b){
      ll ret=1;
      while(b){
        if(b&1) ret=ret*a%mod;
        a=a*a%mod;
        b>>=1;
      }
      return ret;
    }
    
    void init(ll n=1000000){
      f[0]=1;
      for(ll i=1;i<=n;i++) f[i]=f[i-1]*i%mod;
      invf[n]=qpow(f[n],mod-2);
      for(ll i=n-1;i>=0;i--) invf[i]=invf[i+1]*(i+1)%mod;
    }
    
    ll C(ll n,ll m){//O(1)
      if(m>n||m<0) return 0; if(m==n||m==0) return 1;
      return f[n]*invf[m]%mod*invf[n-m]%mod;
    }
    
    int main()
    {
        init();
        ll n,m;scanf("%lld%lld",&n,&m);
        if(n<m) swap(n,m);
        ll ans=0;
        for(ll i=1;i<=m;i++){
            ans=(ans+invf[2]*C(i+i,i)%mod*C(n-i+m-i,n-i)%mod)%mod;
        }
        ans=ans*qpow(C(n+m,n),mod-2)%mod;
        ans=(ans+n)%mod;
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    adb
    js百分比
    隐私策略
    JSON.parse&JSON.stringify
    MVC内容backgroundimage: url('')问题
    mvc笔记
    winform路径
    配置
    邮件发送的原理
    如何调试Windows服务
  • 原文地址:https://www.cnblogs.com/lllxq/p/12343246.html
Copyright © 2011-2022 走看看