AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。
出典:
第一回日本最強プログラマー学生選手権-予選- B – Kleene Inversion
転倒数なる言葉が出てくるが、ソートされていない数字の個数……くらいに考えると分かりやすいかもしれない。転倒=ソート順に逆らっている、というわけだ。
実際、バブルソートを実装した時、その操作回数は転倒数と等しくなる。
from collections import Counter
def main():
N, K = map(int, input().split())
A = list(map(int, input().split()))
MOD = 10**9 + 7
inv_a = 0
for i in range(N-1):
for j in range(i+1, N):
if A[i] > A[j]:
inv_a += 1
result = (inv_a * K) % MOD
cnt = Counter(A)
rest = 0
for n in cnt.values():
rest += (N - n) * n
mult = (K - 1) * K // 2
result = (result + rest * mult // 2) % MOD
print(result)
main()
関連