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