結果
| 問題 |
No.271 next_permutation (2)
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 18:32:17 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,890 bytes |
| コンパイル時間 | 377 ms |
| コンパイル使用メモリ | 82,484 KB |
| 実行使用メモリ | 727,504 KB |
| 最終ジャッジ日時 | 2025-06-12 18:32:22 |
| 合計ジャッジ時間 | 4,880 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 WA * 4 MLE * 1 -- * 11 |
ソースコード
import sys
MOD = 10**9 + 7
def next_permutation(arr):
n = len(arr)
k = n - 2
while k >= 0 and arr[k] >= arr[k+1]:
k -= 1
if k == -1:
return False
l = n - 1
while arr[k] >= arr[l]:
l -= 1
arr[k], arr[l] = arr[l], arr[k]
arr[k+1:] = arr[k+1:][::-1]
return True
def compute_inversion(p):
n = len(p)
inv = 0
for i in range(n):
for j in range(i+1, n):
if p[i] > p[j]:
inv += 1
return inv
def main():
N, K = map(int, sys.stdin.readline().split())
p = list(map(int, sys.stdin.readline().split()))
if K == 0:
print(0)
return
if N == 1:
print(0)
return
if N <= 20:
current = p.copy()
cycle = []
visited = {}
idx = 0
while True:
t = tuple(current)
if t in visited:
break
visited[t] = idx
cycle.append(current.copy())
if not next_permutation(current):
current = [i+1 for i in range(N)]
idx += 1
start = visited[tuple(p)]
cycle_len = len(cycle) - start
invs = [compute_inversion(perm) for perm in cycle]
total_sum = 0
if K <= cycle_len:
for i in range(start, start + K):
total_sum += invs[i % len(cycle)]
else:
full_cycles = K // cycle_len
remainder = K % cycle_len
sum_cycle = sum(invs[start:start + cycle_len])
total_sum += full_cycles * sum_cycle
for i in range(start, start + remainder):
total_sum += invs[i % len(cycle)]
print(total_sum % MOD)
else:
inv4 = pow(4, MOD-2, MOD)
res = K % MOD * ((N * (N-1)) % MOD) % MOD
res = res * inv4 % MOD
print(res)
if __name__ == "__main__":
main()
gew1fw