#include #include using namespace std; using namespace atcoder; #define ll long long #define rep(i,a,b) for(int i=(a);i<(b);i++) #define repl(i,a,b) for(ll i=(a);i<(b);i++) #define all(a) (a).begin(),(a).end() #define rall(a) (a).rbegin(),(a).rend() template bool chmin(T &a,T b){if(a>b){a=b;return true;} return false;} template bool chmax(T &a,T b){if(a> n >> a >> b; using mint=modint998244353; if(a == 1 || b == 1){ if(a == b){ cout << "1\n"; } else{ cout << "2\n"; } return; } vector p(n),q(n); iota(all(p),0); iota(all(q),0); rep(i,0,a) p[i]=a-1-i; rep(i,0,b) q[n-1-i]=n-b+i; vector r(n); rep(i,0,n) r[i]=p[q[i]]; // rep(i,0,n) cout << r[i] << " "; cout << "\n"; vector seen(n,false); mint t=1; vector c; rep(i,0,n){ if(seen[i])continue; int cnt=1; int now=i; seen[now]=true; while(!seen[r[now]]){ cnt++; now=r[now]; seen[now]=true; } c.push_back(cnt); } // rep(i,0,c.size()) cout << c[i] << " "; cout << "\n"; vector isprime(n+1,true); rep(p,2,n+1){ if(!isprime[p]) continue; for(int q=2*p;q<=n;q+=p) isprime[q]=false; } vector>> fac(n+1); rep(p,2,n+1)if(isprime[p]){ for(int q=p;q<=n;q+=p){ int cnt=0; int tmp=q; while(tmp%p == 0){ cnt++; tmp/=p; } fac[q].push_back({p,cnt}); } } vector mx_ex(n+1); rep(i,0,c.size()){ for(auto [p,cnt]:fac[c[i]]){ chmax(mx_ex[p],cnt); } } mint ans=1; rep(i,0,n+1)if(mx_ex[i]) ans*=mint(i).pow(mx_ex[i]); ans*=2; cout << ans.val() << "\n"; return; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int T=1; // cin >> T; while(T--) solve(); }