No.271
階乗進数を考える. これは 桁目の重みが であるような表現法である.
置換 を階乗進数で として置換を辞書順に並べると以下のようになる.
上から 桁目の数字は, 置換において左から 番目より右側にある 番目の数字より小さい数字の個数となる. よって, 階乗進数の各桁の和は置換の転倒数と等しい.
置換から階乗進数を求めるのも上記の性質から Binary Indexed Tree を用いて左の桁から計算していけばいい.
の階乗進数は の階乗進数に単純に を足したものとなる. 階乗進数の右から 桁目は で繰り上がるので足し算の実装は容易である.
ここで, を を階乗進数で表したときの数値未満の転倒数の和とする. そうすると, 答えは
となる. は辞書順で最後の置換から最初の置換に戻った回数 (これは の計算時に求められる), は辞書順で最後の置換である.
は桁 DP の要領で求めればいい.
桁目まで見たときの最大値でない数の転倒数の和を , 最大値の転倒数の和を , 最大値でない数の組み合わせの数を とすると,
となる. ただし, は 桁目にとりうる最大の数, は を階乗進数に変換したときの 桁目の数である.