#arc138f. [arc138_f]KD Tree
[arc138_f]KD Tree
問題文
平面上に 個の点があり,そのうち 番目 () の点は です. なお, は の順列になっています.
あなたは,空でない点の集合 に対し,整列という操作を行えます. 整列とは,以下のような再帰的な操作です.
- に含まれる点がちょうど 個のとき,その点だけからなる列を作る.
- に含まれる点が 個以上のとき,以下の 種類のうちどちらかの操作を行い, に含まれる点からなる列を作る.
- 整数 を自由に選び,座標が 未満の点の集合(この集合を と呼ぶ)と,それ以外の点の集合(この集合を と呼ぶ)に分ける. ここで, や が空であってはならない. を整列してできた列の後ろに, を整列してできた列を連結し,新しい列を作る.
- 整数 を自由に選び,座標が 未満の点の集合(この集合を と呼ぶ)と,それ以外の点の集合(この集合を と呼ぶ)に分ける. ここで, や が空であってはならない. を整列してできた列の後ろに, を整列してできた列を連結し,新しい列を作る.
点の集合 に対して整列を行うとき,その結果としてありうる列の個数を で割った余り求めてください.
制約
- は の順列
- 入力される値はすべて整数である
入力
入力は以下の形式で標準入力から与えられる.
出力
答えを出力せよ.
入力例 1
3
3 1 2
出力例 1
3
以下の 種類の列を得ることができます.
たとえば, という列は,以下の手順で得られます.
- 集合 に対して整列を行う.座標が 未満の点の集合 (\=\\{(2,1)\\}) とそれ以外の点の集合 (\=\\{(1,3),(3,2)\\}) に分ける.
- 集合 に対して整列を行う.列 を得る.
- 集合 に対して整列を行う.座標が 未満の点の集合とそれ以外の点の集合に分ける.
- に対して整列を行う.列 を得る.
- に対して整列を行う.列 を得る.
- 得られた つの列を連結し,列 を得る.
- 得られた つの列を連結し,列 を得る.
入力例 2
5
1 2 3 4 5
出力例 2
1
入力例 3
10
3 6 4 8 7 2 10 5 9 1
出力例 3
1332
入力例 4
30
7 11 8 26 4 13 28 5 14 1 16 27 10 2 23 25 17 6 3 18 24 15 9 22 21 29 12 20 19 30
出力例 4
641915679