Yukicoder 984 Inversion
問題の概要
素数 と 正整数 が与えられる。
数列
について、その転倒数の偶奇を求めよ。(偶なら0、奇なら1を出力)
※ は、 で割った余り
制約
解法
例えば、 の場合、数列は以下のようになります。
この数列の転倒数の偶奇ということは、この数列(順列)を という置換とみなしたときに偶置換か奇置換か、を求める問題です。
偶置換か奇置換かの判定は、例えば、サイクルを観察するとわかります。
一般に、ある置換をサイクル(巡回置換)に分解したとき、その長さを とすると、
の偶奇が、偶置換か奇置換かの答になります(巡回置換を互換の積に表せばよい)。
例えば上の例では、 という 4つのサイクル(巡回置換)に分解されるので、偶置換とわかります。
今回の問題では、1を含むサイクルは集合としては で、その要素数を とおくと、他のサイクルも(例えば要素 を含むサイクルは という形になって)要素数が になるので、は の約数で、 の偶奇が答になります。
あとはを求められればよいのですが、 が 1 に等しくなるような最小の正整数 を求めるという話なので、Baby-step Giant-step algorithm などで解くことができます。
※ 実は、 が奇素数の場合には、 が偶数であることは が偶数であることと同値になり、 が の平方剰余であることと同値になるので、それを使って判定することもできます。( が1か否かで判定)
※ 数学的な書き方では、 が奇素数の場合、 に対して要素 を生成元とする巡回部分群を考えて、それによる商群の位数の偶奇を答えるという問題でした。