atcoder#MUJINPC2017A. Robot Racing

Robot Racing

配点 : 900900

問題文

あなたはカエル型のロボットを開発しています。 あなたはこのロボットに競走をさせることにしました。

まず、あなたは数直線上に NN 体のロボットを置きました。 ロボットには 11 から NN までの番号が振られています。 今、ii 番目のロボットは座標 xix_i にいます。 ただし、xix_i はすべて整数であり、0<x1<x2<...<xN0 < x_1 < x_2 < ... < x_N が成り立ちます。

あなたは次の操作を繰り返し行います。

  • 数直線上のロボットを一体選ぶ。 選んだロボットの座標を xx とする。 座標 x1x - 1, x2x - 2 のうち他のロボットがいない座標を着地点に選ぶ。 選んだロボットを着地点へジャンプさせる。

あるロボットの座標が 0 以下になった場合、そのロボットはゴールしたと見なされ、即座に数直線から取り除かれます。 すべてのロボットがゴールするまで、あなたは操作を行い続けます。

あなたが操作を行う方法によって、NN 体のロボットがゴールする順番は何通りかありえます。 NN 体のロボットがゴールする順番は何通りありうるでしょうか? 109+710^9+7 で割った余りを求めてください。

制約

  • 2N1052 \leq N \leq 10^5
  • xix_i は整数である。
  • 0<x1<x2<...<xN1090 < x_1 < x_2 < ... < x_N \leq 10^9

部分点

  • 500500 点分のテストケースでは、N8N \leq 8 が成り立つ。

入力

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

NN

x1x_1 x2x_2 ...... xNx_N

出力

NN 体のロボットがゴールする順番は何通りありうるか? 109+710^9+7 で割った余りを出力せよ。

3
1 2 3
4

33 体のロボットがゴールする順番は、次の 44 通りありえます。

  • (ロボット1ロボット2ロボット3)(ロボット 1 \to ロボット 2 \to ロボット 3)
  • (ロボット1ロボット3ロボット2)(ロボット 1 \to ロボット 3 \to ロボット 2)
  • (ロボット2ロボット1ロボット3)(ロボット 2 \to ロボット 1 \to ロボット 3)
  • (ロボット2ロボット3ロボット1)(ロボット 2 \to ロボット 3 \to ロボット 1)
3
2 3 4
6

33 体のロボットがゴールする順番は、次の 66 通りありえます。

  • (ロボット1ロボット2ロボット3)(ロボット 1 \to ロボット 2 \to ロボット 3)
  • (ロボット1ロボット3ロボット2)(ロボット 1 \to ロボット 3 \to ロボット 2)
  • (ロボット2ロボット1ロボット3)(ロボット 2 \to ロボット 1 \to ロボット 3)
  • (ロボット2ロボット3ロボット1)(ロボット 2 \to ロボット 3 \to ロボット 1)
  • (ロボット3ロボット1ロボット2)(ロボット 3 \to ロボット 1 \to ロボット 2)
  • (ロボット3ロボット2ロボット1)(ロボット 3 \to ロボット 2 \to ロボット 1)

例えば、次図のように操作を行うと、(ロボット3ロボット2ロボット1)(ロボット 3 \to ロボット 2 \to ロボット 1) の順にゴールします。

a55aed48a00614569d4844f39807e2fb.png

8
1 2 3 5 7 11 13 17
10080
13
4 6 8 9 10 12 14 15 16 18 20 21 22
311014372

答えを 109+710^9+7 で割った余りを出力してください。 なお、このケースは部分点のテストケースには含まれません。