AT_arc160_f [ARC160F] Count Sorted Arrays
Description
[problemUrl]: https://atcoder.jp/contests/arc160/tasks/arc160_f
整数 $ N $ と $ M $ 個の整数の組 $ (a_1,\ b_1),\ (a_2,\ b_2),\ \dots,\ (a_M,\ b_M) $ があります。各 $ a_i,\ b_i $ は $ 1\ \leq\ a_i\ \lt\ b_i\ \leq\ N $ を満たします。
はじめ、あなたは $ (1,2,\dots,N) $ の順列を $ N! $ 種類すべて持っています。
あなたは $ M $ 回の操作を行います。$ i $ 回目の操作は次の通りです。
- 持っている $ N! $ 個の順列すべてに対して次の処理を行う。
- 順列の $ a_i $ 番目の要素と $ b_i $ 番目の要素の値を比較して、前者の方が大きければ両者を swap する。
$ 1\ \leq\ i\ \leq\ M $ について、$ i $ 回目の操作を終了した時点で持っている順列のうち昇順にソートされている列の個数を $ S_i $ とします。
$ S_1,\ S_2,\ \dots,\ S_M $ を出力してください。
ただし、入力では $ (a_i,\ b_i) $ の代わりに整数の組 $ (x_i,\ y_i) $ が与えられます。
$ (a_i,\ b_i) $ の値は $ x_i,\ y_i,\ S_{i-1} $ を用いて次の手順で得ることができます。(便宜上 $ S_0\ =\ 1 $ とします。)
- $ c_i\ =\ ((x_i\ +\ S_{i-1})\ \bmod\ N)\ +\ 1 $ とする。
- $ d_i\ =\ ((y_i\ +\ S_{i-1}\ \times\ 2)\ \bmod\ N)\ +\ 1 $ とする。(ここで $ c_i\ \neq\ d_i $ が保証される。)
- $ a_i\ =\ \min(c_i,\ d_i) $ とする。
- $ b_i\ =\ \max(c_i,\ d_i) $ とする。
Input Format
入力は以下の形式で標準入力から与えられる。
> $ N $ $ M $ $ x_1 $ $ y_1 $ $ x_2 $ $ y_2 $ $ \vdots $ $ x_M $ $ y_M $
Output Format
$ M $ 行出力せよ。$ i $ 行目には $ S_i $ を出力せよ。
Explanation/Hint
### 制約
- $ 2\ \leq\ N\ \leq\ 15 $
- $ 1\ \leq\ M\ \leq\ 5\ \times\ 10^5 $
- $ 1\ \leq\ a_i\ \lt\ b_i\ \leq\ N $
- $ 0\ \leq\ x_i,\ y_i\ \leq\ N\ -\ 1 $
### Sample Explanation 1
はじめ、持っている順列は $ (1,\ 2) $ と $ (2,\ 1) $ です。 $ (a_1,\ b_1)\ =\ (1,\ 2) $ です。$ 1 $ 回目の操作を終了した時点で持っている順列は $ (1,\ 2) $ が $ 2 $ 個になります。よって $ 2 $ を出力します。
### Sample Explanation 2
$ (a_i,\ b_i) $ は順に $ (1,\ 2),\ (2,\ 3),\ (1,\ 3),\ (1,\ 2) $ です。
### Sample Explanation 3
$ (a_i,\ b_i) $ は順に $ (1,\ 2),\ (3,\ 4),\ (1,\ 5),\ (2,\ 3),\ (4,\ 5) $ です。