atcoder#AGC043D. [AGC043D] Merge Triplets

[AGC043D] Merge Triplets

配点 : 12001200

問題文

正整数 NN が与えられます。 (1,2,,3N)(1,2,\cdots,3N) の順列 (P1,P2,,P3N)(P_1,P_2,\cdots,P_{3N})であって、次の操作によって生成されうるものの数を求めてください。 ただし、答えは非常に大きくなることがあるので、素数 MM で割ったあまりを求めてください。

  • 長さ 33 の数列を NN 個用意する。この数列たちを A1,A2,,ANA_1,A_2,\cdots ,A_N とする。この 3N3N 個の値には 11 から 3N3N がちょうど一度ずつ登場せねばならない。
  • 空の数列 PP を用意する。以下の操作を 3N3N 回繰り返す。- 各数列 AiA_i のうち、空でないものの先頭の要素を見て、そのうち最小の要素を xx とする。
    • xxAiA_i から消去する。 PP の最後尾に xx を追加する。
  • 各数列 AiA_i のうち、空でないものの先頭の要素を見て、そのうち最小の要素を xx とする。
  • xxAiA_i から消去する。 PP の最後尾に xx を追加する。

制約

  • 1N20001 \leq N \leq 2000
  • 108M109+710^8 \leq M \leq 10^9+7
  • MM は素数
  • 入力はすべて整数

入力

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

NN MM

出力

条件を満たす順列の数を MM で割ったあまりを出力せよ。

1 998244353
6

すべての長さ 33 の順列が条件を満たします。

2 998244353
261
314 1000000007
182908545