結果

問題 No.271 next_permutation (2)
ユーザー Min_25Min_25
提出日時 2017-05-05 10:42:20
言語 PyPy2
(7.3.15)
結果
AC  
実行時間 143 ms / 2,000 ms
コード長 1,563 bytes
コンパイル時間 1,309 ms
コンパイル使用メモリ 76,160 KB
実行使用メモリ 90,784 KB
最終ジャッジ日時 2024-05-04 18:12:35
合計ジャッジ時間 4,033 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 96 ms
80,000 KB
testcase_01 AC 100 ms
81,064 KB
testcase_02 AC 124 ms
86,288 KB
testcase_03 AC 91 ms
78,976 KB
testcase_04 AC 68 ms
76,928 KB
testcase_05 AC 69 ms
77,440 KB
testcase_06 AC 69 ms
77,336 KB
testcase_07 AC 69 ms
77,352 KB
testcase_08 AC 69 ms
77,088 KB
testcase_09 AC 70 ms
76,800 KB
testcase_10 AC 72 ms
76,936 KB
testcase_11 AC 68 ms
77,184 KB
testcase_12 AC 76 ms
79,096 KB
testcase_13 AC 142 ms
90,688 KB
testcase_14 AC 71 ms
76,988 KB
testcase_15 AC 66 ms
77,372 KB
testcase_16 AC 65 ms
77,340 KB
testcase_17 AC 68 ms
77,312 KB
testcase_18 AC 143 ms
90,784 KB
testcase_19 AC 126 ms
87,552 KB
testcase_20 AC 130 ms
88,448 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0