AtCoder Grand Contest 019 F Yes or No

Yes or No

Description

n +m个问题,其中 n 个问题的答案为Yes m 个问题的答案为No,现在题目以某种顺序依次给出,每次需要回答 Yes No ,在回答完一个问题后你可以马上知道这个问题的正确答案,问期望最多能答对多少题。

Data Constraint

n,m <= 105

Solution

n >=m
可以把答案看成一条由( 0 ,0)走到( n ,m)的路径(每次只能向右或向上走)。
画出直线 y =x- n +m
可以发现当你走到直线上方的决策点时,回答 Yes 答对的概率更大,当你走到直线下方的决策点时,回答 No 答对的概率更大,即不在直线上的决策点时,决策一定(每次回答正确概率更大的答案),且不难发现,无论如何决策一定的决策点一共会有 n 的贡献。

剩下的便是直线上的决策点的贡献,将有12的概率答对,对于每个直线上的决策点算出走到该决策点的概率再乘上 12 便是对答案的贡献了。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)

using namespace std;
typedef long long ll;
const ll N=12e5,mo=998244353;

ll jc[N],ny[N];
int n,m,k;

inline ll ksm(ll o,ll t)
{
    ll y=1;
    for(;t;t>>=1,o=o*o%mo)
    if(t&1)y=y*o%mo;
    return y;
}

inline ll C(ll a,ll b)
{return jc[a]*ny[b]%mo*ny[a-b]%mo;}

int main()
{
    cin>>n>>m;
    if(n<m)swap(n,m);
    k=n<<1;
    jc[0]=ny[0]=1;
    fo(i,1,k)jc[i]=jc[i-1]*i%mo;
    ny[k]=ksm(jc[k],mo-2);
    fd(i,k-1,1)ny[i]=ny[i+1]*(i+1)%mo;
    ll ans=0;
    for(int h=0,z=n-m;h<m;++h,++z)
    ans=(ans+C(h+z,z)*C(n+m-h-z,m-h))%mo;
    ans=ans*ny[2]%mo;
    ll zg=C(n+m,m);
    ans=ans*ksm(zg,mo-2)%mo;
    ans=(ans+n)%mo;
    cout<<ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值