AGC019F Yes or No


题意

有 N+M 个问题,其中有 N 个问题的答案是 YES,M 个问题的答案是 NO

当回答一个问题之后,会知道这个问题的答案,求最优策略下期望对多少。

答案对 998244353 取模。

题解

首先可以想到 \(O(nm)\) 枚举分别剩下几个然后计算每一步的贡献

然后式子推不动,考虑一波实际意义

就是说第一象限有一张 \(n* m\) 的网格 (n>=m),然后从 (0,0) 出发有一条斜率为 1 的射线

从 (n,m) 走到 (0,0),若所在位置在射线左边会回答 NO,否则为 YES

\(m+n\choose n\) 种答案序列可以看成一些从 (n,m) 到 (0,0) 的折线

考虑每一条折线的贡献,发现在射线右边部分的贡献是向左走的步数,在射线左边的是向下走的步数,在射线上钦定为向左走的步数

然后可以将射线上的部分翻到射线下,答案是 n+刚好到射线上的点的概率* \(\frac{1}{2}\)

代码

#include
using namespace std;
#define il inline
#define int long long 
const int N=1e6+11;
const int mod=998244353;
int n,m,k;
int inv[N];
int jc[N],ny[N];
il int read(){
	int s=0;char ch=getchar();
	while(ch>'9'||ch<'0')ch=getchar();
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s;
}
int C(int x,int y){
	if(y<0||x>=1,x=x*x%mod){
		if(y&1)s=s*x%mod;
	}return s;
}
void pre(){
	inv[0]=inv[1]=1;
	ny[0]=jc[0]=1;
	for(int i=1;i