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

using namespace std;

#define Whats(x) cout<<#x<<" is "<<(x)<<endl
#define Divhim() cout<<">>>>>>>>>"<<endl
#define Divher() cout<<"<<<<<<<<<"<<endl
#define Oops() cout<<"!!!!!!!!!!"<<endl

template<typename T> bool Getmax(T &a,T b)
{
	return (a<b)?(a=b,true):false;
}

template<typename T> bool Getmin(T &a,T b)
{
	return (a>b)?(a=b,true):false;
}

#define LL long long
const int MOD=998244353;
const int N=1e6+10;

int n,m,jc[N],njc[N];

int C(int n,int m){return (LL)jc[n]*njc[m]%MOD*njc[n-m]%MOD;}

int Qpow(int x,int y=MOD-2)
{
	int res=1;
	for(;y;y>>=1,x=(LL)x*x%MOD)if(y&1)
		res=(LL)res*x%MOD;
	return res;
}

void Prework()
{
	jc[0]=1;
	for(int i=1;i<N;++i)
		jc[i]=(LL)jc[i-1]*i%MOD;
	njc[N-1]=Qpow(jc[N-1]);
	for(int i=N-2;i>=0;--i)
		njc[i]=(LL)njc[i+1]*(i+1)%MOD;
}

int main()
{
	Prework();
	scanf("%d%d",&n,&m);
	if(n>m)swap(n,m);
	LL ans=(LL)n*C(n+m,n)%MOD;
	for(int i=1;i<=n;++i)
		ans-=(LL)C(i+i-1,i)*C(n+m-2*i,n-i)%MOD;
	ans=ans%MOD*Qpow(C(n+m,n))%MOD;
	ans=n+m-ans;
	ans=(ans%MOD+MOD)%MOD;
	printf("%lld",ans);
	return 0;
}