競プロ er のための群論 (swap と順列と対称群)
この記事はブログから移植したものです。
この記事では競技プログラミングと群論に関する解説をします。競技プログラミングの問題を群論という立場から見ることで、新たな視点を得ることができるようになると思います。また、群論の入門にもなればいいなと思っています。
swap と順列
競技プログラミングの問題に、swap と順列は多く登場します。swap とは、2 つの要素を入れ替える操作のことです。例えば、次のような問題があります。
第二回全国統一プログラミング王決定戦予選 C - Swaps
要素からなる 2 つの整数列 N および A_1,\ldots,A_N が与えられます。以下の操作を B_1,\ldots,B_N 回まで (0 回でもよい) 行うことで、1 以上 N-2 以下のすべての整数 N に対して i となるようにできるか判定してください。 A_i\le B_i
- 1 以上
以下の相異なる整数 N を選び、 x,y の値と A_x の値を入れ替える。 A_y
また、(長さ
AtCoder Beginner Contest 175 D - Moving Piece
高橋君はの番号のついた 1,2,\ldots,N マスからなるマス目の上で、コマを使ってゲームを行おうとしています。マス N には整数 i が書かれています。また、 C_i の順列 1,2,\ldots,N が与えられています。 P_1,P_2,\ldots,P_N
これから高橋君は好きなマスを 1 つ選んでコマを 1 つ置き、1 回以上回以下の好きな回数だけ、次のような方法でコマを移動させます。 K
- 1 回の移動では、現在コマがマス
にあるなら、コマをマス i \ (1\le i\le N) に移動させる。このとき、スコアに P_i が加算される。 C_{P_i} 高橋君のために、ゲーム終了時のスコアとしてあり得る値の最大値を求めてください。(ゲーム開始時のスコアは 0 です。)
この記事の目標は、swap や順列を群論 (特に対称群) の立場から捉えることです。
対称群
swap も順列も、
これは上に書かれている数を下に書かれている数に移すということを表しています。例えば、
すべての数を動かさない写像、すなわち
も
と表します。(一般的な写像の合成と順序が逆であることに注意してください。写像の合成と合わせる場合もありますが、この記事ではこちらを使います。)
2 つの全単射を合成しても全単射なので、
また、
まとめると、
-
ならばf,g\in S_N fg\in S_N -
ならばf,g,h\in S_N f(gh)=(fg)h \text{id}\in S_N -
ならばf\in S_N f^{-1}\in S_N
問題を 1 つ紹介します。
AtCoder Beginner Contest 142 C - Go to School
人の生徒に 1 から N までの番号が 1 つずつ割り振られています。 N
全ての生徒たちが相異なるタイミングで登校しました。
番号の生徒が登校したタイミングで、教室には i 人の生徒がいました。 A_i
生徒たちの登校した順番を求めてください。
対称群の生成元
のように、この置換は 3 つの互換の積で表すことができました。実は、
では次のような問題を考えてみましょう。
個の互換 K が与えられます。これらの互換が (a_i,b_i)\in S_N を生成するか、すなわち S_N の任意の元はこれらの互換の積として表せるか判定してください。 S_N
逆にグラフが連結ならば
-
がグラフの葉であるようなx^{\pi} を 1 つ選ぶ。x -
がx に移るように互換をかける。x^{\pi} - グラフから頂点
を削除する。x^{\pi}
よって、グラフが連結かどうかを判定すればよいです。
このことから、
では次にこのような問題を考えてみましょう。
人が一列に並んでいます。 N 種類の操作があり、 K 番目の操作では、前から i 番目の人と前から a_i 番目の人を入れ替えることができます。これらの操作を好きな順番で好きな回数行うとき、操作後の人の並び方としてあり得る状態の数は何通りありますか。 b_i
数学的には、
では実際の問題を解いてみましょう。
AtCoder Beginner Contest 097 D - Equals
1 からまでの整数を並び替えた順列 N があります。また、1 以上 p_1,p_2,\ldots,p_N 以下の整数のペアが N 個与えられます。これらは M で表されます。シカの AtCoDeer くんは順列 (x_1,y_1),(x_2,y_2),\ldots,(x_M,y_M) に次の操作を好きなだけ行って、 p となる p_i=i の数を最大にしようと考えています。 i \ (1\le i\le N)
なる 1\le j\le M を選び、 j と p_{x_j} をスワップする。 p_{y_j} 操作後の
となる p_i=i の数として考えうる最大値を求めてください。 i
AtCoder Grand Contest 003 C - BBuBBBlesort!
高橋君は、誕生日に長さの数列をもらいました。 N 番目の要素は整数 i \ (1\le i\le N) です。どの 2 つの要素も、互いに異なります。高橋君はこの数列を単調増加になるように並べ替えたいです。高橋君は超能力者なので、以下の 2 つの操作が任意のタイミングで出来ます。 A_i
- 操作 1: 数列の連続する 2 つの要素を選び、その 2 つの順番を反転する。
- 操作 2: 数列の連続する 3 つの要素を選び、その 3 つの順番を反転する。
高橋君は操作 2 は好きですが、操作 1 は嫌いです。この 2 種類の操作を使って数列を単調増加になるように並び替えるときの、操作 1 の最小回数を求めてください。
操作 1 は互換
AtCoder Beginner Contest 233 F - Swap and Sort
を並び替えた長さ (1,2,\ldots,N) の順列 N があります。 P=(P_1,P_2,\ldots,P_N)
あなたが可能な操作は種類あり、操作 M は「 i の P 番目の要素と a_i の P 番目の要素を入れ替える」というものです。 b_i
操作を好きな順序で、合計回以下行うことによって、 5\times10^5 を昇順に並び替えることはできますか? P
できるならば、操作手順を 1 つ教えてください。できないならばその旨を伝えてください。
この問題も連結成分上で好きなように動かせることを用います。構築も上で述べたように、全域木をとって頂点を削除していくことで解けます。
転倒数と交代群
のように、3 個の互換の積で表すことも、5 個の互換の積で表すこともできます。このように個数は一意ではありませんが、実は個数の偶奇は一意に定まります。上の例では、常に互換の個数は奇数になります。すなわち偶数個の互換の積で表すことはできないということです。
これを証明してみます。突然ですが、
よって次のような定義ができます。
- 偶数個の互換の積として表せる置換を偶置換といい、
- 奇数個の互換の積として表せる置換を奇置換という。
偶置換と偶置換の積は偶置換になります。よって
に対し、 i=1,2,\ldots,N を i に移す置換は偶置換か奇置換か決定してください。 P_i
ここで転倒数という概念を導入します。置換
偶置換に関する問題を解いてみましょう。
AtCoder Beginner Contest 244 D - Swap Hats
1,2,3 の番号がついた 3 人の高橋くんがおり、赤・緑・青の色がついた 3 種類の帽子がそれぞれ 1 つずつあります。
それぞれの高橋くんは帽子を 1 つかぶっており、高橋くんがはじめにかぶっている帽子の色は文字 i で表されます。 S_i
これから、以下の操作をちょうど回行います。 10^{18}
- 3 人の高橋くんのうち 2 人を選ぶ。2 人はお互いのかぶっている帽子を交換する。
回の操作の後、高橋くん 10^{18} が文字 i に対応する色の帽子をかぶっているようにすることはできますか? T_i
入れ替える操作をちょうど
Codeforces Round #598 (Div. 3) F. Equalizing Two Strings
英小文字からなる 2 つの長さの文字列 n が与えられます。以下の操作を行うことができます。 s,t
- 1 以上
以下の整数 n を 1 つ選ぶ。 len の長さ s の連続部分文字列を選び、反転させる。 len - 同時に、
の長さ t の連続部分文字列を選び、反転させる。 len 何回か操作を行うことで、
を等しくできるでしょうか。 s,t
まず出現回数が異なる文字がある場合は不可能です。以下出現回数が等しいとします。等しい文字があるときは可能です。なぜなら、
巡回置換
頂点数は有限個なので、移動を続けると途中で既に通った頂点に出会います。このとき経路は6の字型にはなりません。
なぜなら
よって、このグラフはサイクルがいくつか集まったものになります。このことを群論的に表現してみましょう。
上で述べたことは、任意の置換が共通文字を含まないいくつかの巡回置換の積として表せるということです。例えば
のようになります。
Codeforces Round #595 (Div. 3) B2. Books Exchange (hard version)
人の子供たちがおり、それぞれ本を持っています。毎日の終わりに、 n 番目の子供は持っている本を i 番目の子供に渡します。ここで p_i は p の順列です。子供ごとに、自分の本が自分のところに戻ってくるまでに何日かかるか求めてください。 1,2,\ldots,n
AtCoder Beginner Contest 175 D - Moving Piece
高橋君はの番号のついた 1,2,\ldots,N マスからなるマス目の上で、コマを使ってゲームを行おうとしています。マス N には整数 i が書かれています。また、 C_i の順列 1,2,\ldots,N が与えられています。 P_1,P_2,\ldots,P_N
これから高橋君は好きなマスを 1 つ選んでコマを 1 つ置き、1 回以上回以下の好きな回数だけ、次のような方法でコマを移動させます。 K
- 1 回の移動では、現在コマがマス
にあるなら、コマをマス i \ (1\le i\le N) に移動させる。このとき、スコアに P_i が加算される。 C_{P_i} 高橋君のために、ゲーム終了時のスコアとしてあり得る値の最大値を求めてください。(ゲーム開始時のスコアは 0 です。)
これも冒頭のシチュエーションと一致します。よって巡回置換の積に分解して、各巡回置換上で考えればよいことになります。
最初の移動で到達するマスを固定します。このマスを含むサイクルの長さが
- 一周の総和が正のときは回れるだけ回って、残った
個について和の最大値を求めます。((K-1) \bmod{L})+1 - 一周の総和が 0 以下で
のときは、1 個以上K\ge L 個以下の和の最大値を求めます。L - 一周の総和が 0 以下で
のときは、1 個以上K\le L 個以下の和の最大値を求めます。K
これで計算量
AtCoder Beginner Contest 013 D - 阿弥陀
本の縦線と N 本の横線からなるあみだくじがあり、上から M 番目の横線は左から i 番目の縦線と A_i 番目の縦線を結んでいます。このあみだくじを縦に A_i+1 個つなげます。各整数 D に対し、左から k=1,2,\ldots,N 番目の縦線から出発したとき、最終的に左から何番目の縦線に到着するか求めてください。 k
与えられるあみだくじは対称群
第二回全国統一プログラミング王決定戦予選 C - Swaps
要素からなる 2つの整数列 N および A_1,\ldots,A_N が与えられます。以下の操作を B_1,\ldots,B_N 回まで (0 回でもよい) 行うことで、1 以上 N-2 以下のすべての整数 N に対して i となるようにできるか判定してください。 A_i\le B_i
- 1 以上
以下の相異なる整数 N を選び、 x,y の値と A_x の値を入れ替える。 A_y
swap を
長さ
まず適切に並べ替えておくことで、
演習問題
- AtCoder Beginner Contest 190 F - Shift and Inversions
- AtCoder Regular Contest 136 B - Triple Shift
- AtCoder Regular Contest 147 B - Swap to Sort
- AtCoder Beginner Contest 296 F - Simultaneous Swap
- Chokudai SpeedRun 001 L - N回スワップ
- Educational Codeforces Round 14 D. Swaps in Permutation
- Codeforces Round #485 (Div. 2) E. Petr and Permutations
- Codeforces Round #653 (Div. 3) F. Cyclic Shifts Sorting
- yukicoder No.1115 二つの数列 / Two Sequences
- yukicoder No.2045 Two Reflections
参考文献
- 齋藤正彦, 『線型代数入門』, 東京大学出版会, 1966. (線型代数の有名な教科書です。対称群の理論は行列式を扱うときにも登場します)
- 雪江明彦, 『代数学1 群論入門』, 日本評論社, 2010. (対称群に限らない一般の群論について扱う教科書です。かなり丁寧です)
- 桂利行, 『代数学I 群と環』, 東京大学出版会, 2004. (群論の教科書です。薄いです)
Discussion