atcoder#ARC083D. [ARC083F] Collecting Balls

[ARC083F] Collecting Balls

配点: 12001200

問題文

xyxy 平面上に 2N2N 個のボールがあります。このうち ii 番目のボールの位置は (xi,yi)(x_i, y_i) です。 ここで、すべての ii について xi,yix_i, y_i11 以上 NN 以下の整数であり、22 つ以上のボールが同じ位置にあることはありません。

すぬけ君は、これらのボールを回収するために、タイプ A, B のロボットを NN 台ずつ用意し、 位置 (1,0),(2,0),...,(N,0)(1, 0), (2, 0), ..., (N, 0) にタイプ A のロボットを、位置 (0,1),(0,2),...,(0,N)(0, 1), (0, 2), ..., (0, N) にタイプ B のロボットをそれぞれ 11 台ずつ設置しました。

それぞれのタイプのロボットは起動されると以下のように動作します。

  • タイプ A のロボットは、位置 (a,0)(a, 0) で起動されると、直線 x=ax = a 上にあるボールのうち yy 座標の値が最小のものを回収して停止する。そのようなボールが存在しない場合は何もせずに停止する。
  • タイプ B のロボットは、位置 (0,b)(0, b) で起動されると、直線 y=by = b 上にあるボールのうち xx 座標の値が最小のものを回収して停止する。そのようなボールが存在しない場合は何もせずに停止する。

一度停止したロボットをもう一度起動することはできません。また、動作中のロボットがある場合、それが停止するまで新たなロボットを起動することはできません。

すぬけ君は、ロボットを起動しようとして、起動する順序によってはすべてのボールを回収することができない可能性があることに気づきました。

ロボットを起動する順序として考えられる (2N)!(2N)! 通りのうち、すべてのボールを回収できるような順序の個数を 1,000,000,0071,000,000,007 で割った余りを求めてください。

制約

  • 2N1052 \leq N \leq 10^5
  • 1xiN1 \leq x_i \leq N
  • 1yiN1 \leq y_i \leq N
  • iji \neq j のとき、xixjx_i \neq x_j または yiyjy_i \neq y_j

入力

入力は以下の形式で標準入力から与えられる。

NN

x1x_1 y1y_1

......

x2Nx_{2N} y2Ny_{2N}

出力

すべてのボールを回収できるようなロボットの起動順序の個数を 1,000,000,0071,000,000,007 で割った余りを出力せよ。

2
1 1
1 2
2 1
2 2
8

位置 (1,0),(2,0)(1,0), (2, 0) に設置されたロボットをそれぞれ A1, A2 と呼び、位置 (0,1),(0,2)(0, 1), (0, 2) に設置されたロボットをそれぞれ B1, B2 と呼ぶことにします。 このとき、条件を満たす起動順序は以下の 88 通りあります。

  • A1, B1, A2, B2
  • A1, B1, B2, A2
  • A1, B2, B1, A2
  • A2, B1, A1, B2
  • B1, A1, B2, A2
  • B1, A1, A2, B2
  • B1, A2, A1, B2
  • B2, A1, B1, A2

よって 88 を出力します。

4
3 2
1 2
4 1
4 2
2 2
4 4
2 1
1 3
7392
4
1 1
2 2
3 3
4 4
1 2
2 1
3 4
4 3
4480
8
6 2
5 1
6 8
7 8
6 5
5 7
4 3
1 4
7 6
8 3
2 8
3 6
3 2
8 5
1 5
5 8
82060779
3
1 1
1 2
1 3
2 1
2 2
2 3
0

条件を満たす順序が存在しない場合、答えは 00 となります。