No.271

階乗進数を考える. これは 桁目の重みが であるような表現法である.

置換 を階乗進数で として置換を辞書順に並べると以下のようになる.

上から 桁目の数字は, 置換において左から 番目より右側にある 番目の数字より小さい数字の個数となる. よって, 階乗進数の各桁の和は置換の転倒数と等しい.

置換から階乗進数を求めるのも上記の性質から Binary Indexed Tree を用いて左の桁から計算していけばいい.

の階乗進数は の階乗進数に単純に を足したものとなる. 階乗進数の右から 桁目は で繰り上がるので足し算の実装は容易である.

ここで, を階乗進数で表したときの数値未満の転倒数の和とする. そうすると, 答えは

となる. は辞書順で最後の置換から最初の置換に戻った回数 (これは の計算時に求められる), は辞書順で最後の置換である.

は桁 DP の要領で求めればいい.

桁目まで見たときの最大値でない数の転倒数の和を , 最大値の転倒数の和を , 最大値でない数の組み合わせの数を とすると,

となる. ただし, 桁目にとりうる最大の数, を階乗進数に変換したときの 桁目の数である.