Yes or No
Description
有
n
+
Data Constraint
n,m <= 105
Solution
设
n
>=
可以把答案看成一条由(
0
,
画出直线
y
=
可以发现当你走到直线上方的决策点时,回答
Yes
答对的概率更大,当你走到直线下方的决策点时,回答
No
答对的概率更大,即不在直线上的决策点时,决策一定(每次回答正确概率更大的答案),且不难发现,无论如何决策一定的决策点一共会有
n
的贡献。
剩下的便是直线上的决策点的贡献,将有
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;
}