#include #include #include using namespace std; using ll = long long; void solve (int N, vector &X, vector &Y) { // 全部異なる要素とのことなので、XとYの小さい方からN個の和になればいいわけですな // それなら要素が採用されるならmin(X[i], Y[P[i]])のバトルに勝てる必要があるわけで、小さい方から貪欲にとってるわけだからほかの採用メンバーにぶつからない限り必勝のはず // -> ほかの採用メンバーにぶつからないような割り当てならOK const ll MOD = 998244353; vector> Z(2*N); for (int i = 0; i < N; i++) Z[i] = make_pair(X[i], 'X'); for (int i = 0; i < N; i++) Z[N+i] = make_pair(Y[i], 'Y'); sort(Z.begin(), Z.end(), [](pair &a, pair &b) { return a.first < b.first; }); int k = 0; for (int i = 0; i < N; i++) { if (Z[i].second == 'X') k++; } // 解はk!(N-k)! ll ans = 1; for (int i = 1; i <= k; i++) { ans *= i; ans %= MOD; } for (int i = 1; i <= N-k; i++) { ans *= i; ans %= MOD; } cout << ans << "\n"; } int main () { int N; cin >> N; vector X(N), Y(N); for (int i = 0; i < N; i++) cin >> X[i]; for (int i = 0; i < N; i++) cin >> Y[i]; solve(N, X, Y); }