atcoder#ARC160F. [ARC160F] Count Sorted Arrays

[ARC160F] Count Sorted Arrays

配点 : 900900

問題文

整数 NNMM 個の整数の組 (a1,b1),(a2,b2),,(aM,bM)(a_1, b_1), (a_2, b_2), \dots, (a_M, b_M) があります。各 ai,bia_i, b_i1ai<biN1 \leq a_i \lt b_i \leq N を満たします。

はじめ、あなたは (1,2,,N)(1,2,\dots,N) の順列を N!N! 種類すべて持っています。 あなたは MM 回の操作を行います。ii 回目の操作は次の通りです。

  • 持っている N!N! 個の順列すべてに対して次の処理を行う。- 順列の aia_i 番目の要素と bib_i 番目の要素の値を比較して、前者の方が大きければ両者を swap する。
  • 順列の aia_i 番目の要素と bib_i 番目の要素の値を比較して、前者の方が大きければ両者を swap する。

1iM1 \leq i \leq M について、ii 回目の操作を終了した時点で持っている順列のうち昇順にソートされている列の個数を SiS_i とします。 S1,S2,,SMS_1, S_2, \dots, S_M を出力してください。

ただし、入力では (ai,bi)(a_i, b_i) の代わりに整数の組 (xi,yi)(x_i, y_i) が与えられます。 (ai,bi)(a_i, b_i) の値は xi,yi,Si1x_i, y_i, S_{i-1} を用いて次の手順で得ることができます。(便宜上 S0=1S_0 = 1 とします。)

  • ci=((xi+Si1)modN)+1c_i = ((x_i + S_{i-1}) \bmod N) + 1 とする。
  • di=((yi+Si1×2)modN)+1d_i = ((y_i + S_{i-1} \times 2) \bmod N) + 1 とする。(ここで cidic_i \neq d_i が保証される。)
  • ai=min(ci,di)a_i = \min(c_i, d_i) とする。
  • bi=max(ci,di)b_i = \max(c_i, d_i) とする。

制約

  • 2N152 \leq N \leq 15
  • 1M5×1051 \leq M \leq 5 \times 10^5
  • 1ai<biN1 \leq a_i \lt b_i \leq N
  • 0xi,yiN10 \leq x_i, y_i \leq N - 1

入力

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

NN MM

x1x_1 y1y_1

x2x_2 y2y_2

\vdots

xMx_M yMy_M

出力

MM 行出力せよ。ii 行目には SiS_i を出力せよ。

2 1
1 1
2

はじめ、持っている順列は (1,2)(1, 2)(2,1)(2, 1) です。 (a1,b1)=(1,2)(a_1, b_1) = (1, 2) です。11 回目の操作を終了した時点で持っている順列は (1,2)(1, 2)22 個になります。よって 22 を出力します。

3 4
0 1
2 1
1 1
0 1
2
4
4
6

(ai,bi)(a_i, b_i) は順に (1,2),(2,3),(1,3),(1,2)(1, 2), (2, 3), (1, 3), (1, 2) です。

5 5
4 4
0 4
1 1
2 4
1 2
2
4
4
8
16

(ai,bi)(a_i, b_i) は順に (1,2),(3,4),(1,5),(2,3),(4,5)(1, 2), (3, 4), (1, 5), (2, 3), (4, 5) です。