/** * @FileName a.cpp * @Author kanpurin * @Created 2022.08.20 06:11:47 **/ #include "bits/stdc++.h" using namespace std; typedef long long ll; class UnionFind { private: vector par; public: UnionFind(int n) { par.resize(n, -1); } int root(int x) { if (par[x] < 0) return x; return par[x] = root(par[x]); } bool unite(int x, int y) { int rx = root(x); int ry = root(y); if (rx == ry) return false; if (size(rx) < size(ry)) swap(rx, ry); par[rx] += par[ry]; par[ry] = rx; return true; } bool same(int x, int y) { int rx = root(x); int ry = root(y); return rx == ry; } int size(int x) { return -par[root(x)]; } }; struct Osa_k { private: std::vector v; public: Osa_k(int n) { assert(n >= 1); v.resize(n+1,-1); v[1] = 1; for(int i = 2; i <= n; i++) { if (v[i] != -1) continue; for(int j = i; j <= n; j += i) v[j] = i; } } std::vector> prime_factorization(int n) { assert(1 <= n && n < v.size()); std::vector ret; while(n > 1) ret.push_back(v[n]), n /= v[n]; std::vector> ans; for (int i = 0; i < ret.size(); i++) { if (ans.size() == 0 || ans.back().first != ret[i]) { ans.push_back({ret[i],1}); } else { ans.back().second++; } } return ans; } }; constexpr int MOD = 998244353; ll powMod(ll k, ll n, ll mod) { ll x = 1; while (n > 0) { if (n & 1) { x = x * k % mod; } k = k * k % mod; n >>= 1; } return x; } int main() { int n;cin >> n; int p,q;cin >> p >> q; UnionFind uf(n); for (int l = 0,r=p-1; l < r; l++,r--) { uf.unite(l,r); } for (int l = n-q,r=n-1; l < r; l++,r--) { uf.unite(l,r); } Osa_k osa_k(2*n); vector v(2*n+1); for (int i = 0; i < n; i++) { if (uf.root(i) != i) continue; if (uf.size(i) == 1) continue; auto prime = osa_k.prime_factorization(2*uf.size(i)); for (auto pp : prime) { v[pp.first] = max(v[pp.first],pp.second); } } ll ans = 1; for (int i = 2; i <= n; i++) { ans *= powMod(i,v[i],MOD); ans %= MOD; } cout << ans << endl; return 0; }