atcoder#AGC055F. [AGC055F] Creative Splitting

[AGC055F] Creative Splitting

配点 : 18001800

問題文

整数 N,KN, K が与えられます。

長さ KK の整数列 a=[a1,a2,,aK]a=[a_1, a_2, \ldots, a_K] が全ての 1iK1 \le i \le K について 1aii1 \le a_i \le i を満たすとき、aa良い列と呼びます。

長さ NKNK の整数列 b=[b1,b2,,bNK]b=[b_1, b_2, \ldots, b_{NK}] が次の条件を満たすとき、bb素晴らしい列と呼びます: bbNN 個の長さ KK の(連続とは限らない)部分列に分解する方法であって、各部分列が良い列であるような方法が存在する。

f(pos,val)f(pos, val) を、bpos=valb_{pos}=val であるような素晴らしい列 bb の個数と定義します。

全ての 1posNK1\le pos \le NK, 1valK1 \le val \le K について f(pos,val)f(pos, val) を求めてください。これらの数値は非常に大きい可能性があるため、これらを素数 PP で割った余りを出力してください。

制約

  • 1N201 \le N \le 20
  • 1K201 \le K \le 20
  • 108P10910^8 \le P \le 10^9
  • PP は素数である。

入力

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

NN KK PP

出力

NKNK 行出力せよ。ii 行目の jj 個目の数値が (f(i,j)modP)(f(i, j) \bmod P) となるようにすること。

2 2 965166677
6 0 
4 2 
4 2 
3 3

以下の 66 個の素晴らしい列が存在します。

  • [1,1,1,1][1, 1, 1, 1]: [b1,b2],[b3,b4][b_1, b_2], [b_3, b_4] に分割できます。
  • [1,1,1,2][1, 1, 1, 2]: [b1,b2],[b3,b4][b_1, b_2], [b_3, b_4] に分割できます。
  • [1,2,1,1][1, 2, 1, 1]: [b1,b2],[b3,b4][b_1, b_2], [b_3, b_4] に分割できます。
  • [1,2,1,2][1, 2, 1, 2]: [b1,b2],[b3,b4][b_1, b_2], [b_3, b_4] に分割できます。
  • [1,1,2,1][1, 1, 2, 1]: [b1,b3],[b2,b4][b_1, b_3], [b_2, b_4] に分割できます。
  • [1,1,2,2][1, 1, 2, 2]: [b1,b3],[b2,b4][b_1, b_3], [b_2, b_4] に分割できます。