#include #include #include using namespace std; const int MAXN = 2e5 + 12; const int B = 500; const int mod = 998244353; int n,m,k; long long fct[MAXN<<1],rev[MAXN<<1],rfct[MAXN<<1]; long long f[MAXN<<1]; #define C(x,y) (fct[x]*rfct[y]%mod*rfct[(x)-(y)]%mod) int p[MAXN<<1],q[MAXN<<1]; inline void upd(int&x,int y) { x += y; if (x>=mod) x -= mod; } void solve1() { f[0] = 1; p[k] = 1; for (int t=1;t<=n+m;t++) { for (int i=0;i<=2*k;i++) { if (i>0) upd(q[i-1],p[i]); if (i<2*k) upd(q[i+1],p[i]); } for (int i=0;i<=2*k;i++) { p[i] = q[i],q[i] = 0; } f[t] = p[k]; } } inline long long cal(int D,int H) { if (H<0) H = -H; if (H>D) return 0; return C(D,(D+H)/2); } void solve2() { f[0] = 1; for (int t=2;t<=n+m;t+=2) { f[t] = cal(t,0); int x = 0,y = 0; for (int i=1;i<=t/(k*2)+3;i++) { if (i%2==1) x = (k*2+2-x),y = (-k*2-2-y); else y = (k*2+2-y),x = (-k*2-2-x); if (i%2==1) f[t] = (f[t] - cal(t,x) - cal(t,y) + 2ll*mod)%mod; else f[t] = (f[t] + cal(t,x) + cal(t,x))%mod; } } } int main() { fct[0] = rfct[0] = rev[1] = fct[1] = rfct[1] = 1; for (int i=2;im) swap(n,m); k = k/2; if (k<=B/2) solve1(); else solve2(); long long ans = 0; for (int i=0;i<=n;i++) { ans = (ans + C(n+m,i*2)*f[i*2]%mod*C(n+m-2*i,n-i))%mod; } printf("%lld",ans); return 0; }