#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
#define Rep(i,a,b) for(register int i=(a);i<=int(b);++i)
#define Dep(i,a,b) for(register int i=(a);i>=int(b);--i)
#define rep(i,a,b) for(register int i=(a);i<int(b);++i)
#define mem(x,v) memset(x,v,sizeof(x))
#define fi first
#define se second
#define lowbit(x) ((x)&-(x))
#define debug(x) cout << #x " = " << x << endl;
namespace IO{
	const int L = 1 << 15;
	char ibuf[L|1],*iS=ibuf,*iT=ibuf;
	char obuf[L|1],*oS=obuf,*oT=obuf+L;
	char c,st[66];int tp=0,f;
	inline char gc(){
		if(iS==iT) iT=(iS=ibuf)+fread(ibuf,sizeof(char),L,stdin);
		return (*iS++);
	}
	inline void flush() {
		fwrite(obuf,sizeof(char),oS-obuf,stdout);
		oS = obuf;
	}
	inline void pc(char c){*oS++=c;if(oS==oT) flush();}
	#define gc getchar
	#define pc putchar
	inline ll read(){
		ll x=0;f=1,c=gc();
		for(;!isdigit(c);c=gc())if(c=='-')f=-1;
		for(;isdigit(c);c=gc())x=(x<<1)+(x<<3)+(c&15);
		return x*f;
	}
	void write(ll x){
		if(!x) pc('0');if(x<0) pc('-'),x=-x;
		while(x) st[++tp]=x%10+'0',x/=10;
		while(tp) pc(st[tp--]);
	}
	void wri(ll x){write(x);pc(' ');}
	void writeln(ll x){write(x);pc('\n');}
	struct IOflusher{~IOflusher(){flush();}}_ioflusher_;
}
using IO::read;
using IO::writeln;
using IO::wri;
inline void gg(string s){cout << s << endl;exit(0);}
inline void gg(ll x){writeln(x);exit(0);}
const int maxn = 1e7+233;
const int mod = 998244353;
int n,a,b,fac[maxn],ifac[maxn],inv[maxn];
inline int C(int n,int m){
	if(m<0||n<m) return 0;
	return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int F(int x,int y){
	if(y<=x-1) return 0;
	return (C(x+y,x)-C(x+y,x-1)+mod)%mod;
}
int main(){
	fac[0] = ifac[0] = fac[1] = ifac[1] = inv[1] = 1;
	rep(i,2,maxn) {
		fac[i] = 1ll * fac[i-1] * i % mod;
		inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
		ifac[i] = 1ll * ifac[i-1] * inv[i] % mod;
	}
	n = read(),a = read(),b = read();
	if(!b) gg(1);
	int ans = 0;
	Rep(i,0,n-b){
		int ways = F(i,b-1);
		if(i+b==n){
			if(i==a) ans = (ans + ways) % mod;
		} else{
			int x = n - b - i - 1,y = a - i + 1;
			ans = (ans + 1ll * ways * C(x+y-1,y-1)) % mod;
		}
	}writeln(ans);
	return 0;
}
//fix gcz's blog:
//3操作其实并不是最后一次等于，而是递增的最后一次等于，也就是说前面有比他大的我不去管的
//发现这些位置后面恰好都可以放，其它位置都不能放

### Prompt

Your task is to create a Cpp solution to the following problem:

We have two indistinguishable pieces placed on a number line. Both pieces are initially at coordinate 0. (They can occupy the same position.)

We can do the following two kinds of operations:

* Choose a piece and move it to the right (the positive direction) by 1.
* Move the piece with the smaller coordinate to the position of the piece with the greater coordinate. If two pieces already occupy the same position, nothing happens, but it still counts as doing one operation.



We want to do a total of N operations of these kinds in some order so that one of the pieces will be at coordinate A and the other at coordinate B. Find the number of ways to move the pieces to achieve it. The answer can be enormous, so compute the count modulo 998244353.

Two ways to move the pieces are considered different if and only if there exists an integer i (1 \leq i \leq N) such that the set of the coordinates occupied by the pieces after the i-th operation is different in those two ways.

Constraints

* 1 \leq N \leq 10^7
* 0 \leq A \leq B \leq N
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N A B


Output

Print the number of ways to move the pieces to achieve our objective, modulo 998244353.

Examples

Input

5 1 3


Output

4


Input

10 0 0


Output

1


Input

10 4 6


Output

197


Input

1000000 100000 200000


Output

758840509

### Response

```cpp
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
#define Rep(i,a,b) for(register int i=(a);i<=int(b);++i)
#define Dep(i,a,b) for(register int i=(a);i>=int(b);--i)
#define rep(i,a,b) for(register int i=(a);i<int(b);++i)
#define mem(x,v) memset(x,v,sizeof(x))
#define fi first
#define se second
#define lowbit(x) ((x)&-(x))
#define debug(x) cout << #x " = " << x << endl;
namespace IO{
	const int L = 1 << 15;
	char ibuf[L|1],*iS=ibuf,*iT=ibuf;
	char obuf[L|1],*oS=obuf,*oT=obuf+L;
	char c,st[66];int tp=0,f;
	inline char gc(){
		if(iS==iT) iT=(iS=ibuf)+fread(ibuf,sizeof(char),L,stdin);
		return (*iS++);
	}
	inline void flush() {
		fwrite(obuf,sizeof(char),oS-obuf,stdout);
		oS = obuf;
	}
	inline void pc(char c){*oS++=c;if(oS==oT) flush();}
	#define gc getchar
	#define pc putchar
	inline ll read(){
		ll x=0;f=1,c=gc();
		for(;!isdigit(c);c=gc())if(c=='-')f=-1;
		for(;isdigit(c);c=gc())x=(x<<1)+(x<<3)+(c&15);
		return x*f;
	}
	void write(ll x){
		if(!x) pc('0');if(x<0) pc('-'),x=-x;
		while(x) st[++tp]=x%10+'0',x/=10;
		while(tp) pc(st[tp--]);
	}
	void wri(ll x){write(x);pc(' ');}
	void writeln(ll x){write(x);pc('\n');}
	struct IOflusher{~IOflusher(){flush();}}_ioflusher_;
}
using IO::read;
using IO::writeln;
using IO::wri;
inline void gg(string s){cout << s << endl;exit(0);}
inline void gg(ll x){writeln(x);exit(0);}
const int maxn = 1e7+233;
const int mod = 998244353;
int n,a,b,fac[maxn],ifac[maxn],inv[maxn];
inline int C(int n,int m){
	if(m<0||n<m) return 0;
	return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int F(int x,int y){
	if(y<=x-1) return 0;
	return (C(x+y,x)-C(x+y,x-1)+mod)%mod;
}
int main(){
	fac[0] = ifac[0] = fac[1] = ifac[1] = inv[1] = 1;
	rep(i,2,maxn) {
		fac[i] = 1ll * fac[i-1] * i % mod;
		inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
		ifac[i] = 1ll * ifac[i-1] * inv[i] % mod;
	}
	n = read(),a = read(),b = read();
	if(!b) gg(1);
	int ans = 0;
	Rep(i,0,n-b){
		int ways = F(i,b-1);
		if(i+b==n){
			if(i==a) ans = (ans + ways) % mod;
		} else{
			int x = n - b - i - 1,y = a - i + 1;
			ans = (ans + 1ll * ways * C(x+y-1,y-1)) % mod;
		}
	}writeln(ans);
	return 0;
}
//fix gcz's blog:
//3操作其实并不是最后一次等于，而是递增的最后一次等于，也就是说前面有比他大的我不去管的
//发现这些位置后面恰好都可以放，其它位置都不能放

```