結果
| 問題 |
No.271 next_permutation (2)
|
| コンテスト | |
| ユーザー |
Min_25
|
| 提出日時 | 2017-05-05 10:42:20 |
| 言語 | PyPy2 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 153 ms / 2,000 ms |
| コード長 | 1,563 bytes |
| コンパイル時間 | 1,784 ms |
| コンパイル使用メモリ | 76,548 KB |
| 実行使用メモリ | 90,516 KB |
| 最終ジャッジ日時 | 2024-11-26 07:46:28 |
| 合計ジャッジ時間 | 4,495 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
import sys
from itertools import permutations
def solve():
def factoradic(n, seq):
def add(idx, v):
while idx <= n:
fenwick[idx] += v
idx += idx & -idx
return
def read(idx):
ret = 0
while idx > 0:
ret += fenwick[idx]
idx &= idx - 1
return ret
fenwick = [0] * (n + 1)
for i in range(2, n + 1):
add(i, 1)
ret = [1] * n
for i, c in enumerate(seq):
ret[i] = read(c + 1)
add(c + 1, -1)
return ret
def sum_inv_all(n):
return (n * (n - 1) // 2) % mod * ((mod + 1) // 2) % mod * facts[n] % mod
def sum_inv(A):
n = len(A)
block = 0
ret = 0
isum = 0
for i in range(n - 1, 0, -1):
d = A[i]
s = i * (i + 1) // 2 % mod
t = d * (d - 1) // 2 % mod
u = s * block + t + d * isum
ret = (ret + u % mod * facts[i]) % mod
isum += d
block = (block * (i + 1) + d) % mod
return ret
def update(vals, K):
n = len(vals)
for i in range(1, n):
K, vals[i] = divmod(vals[i] + K, i + 1)
ret = 0
if K > 0:
ret = K % mod * sum_inv_all(n) % mod
return ret
F = 100010
mod = 10 ** 9 + 7
facts = [1] * F
for i in range(1, F):
facts[i] = facts[i - 1] * i % mod
input = sys.stdin.readline
while 1:
try:
N, K = map(int, input().split())
except:
break
A = [c - 1 for c in map(int, input().split())]
vals = factoradic(N, A)[::-1]
ans = -sum_inv(vals)
ans += update(vals, K)
ans += sum_inv(vals)
print(ans % mod)
solve()
Min_25