結果

問題 No.271 next_permutation (2)
ユーザー Min_25Min_25
提出日時 2017-05-05 10:25:03
言語 PyPy2
(7.3.15)
結果
WA  
実行時間 -
コード長 1,530 bytes
コンパイル時間 143 ms
コンパイル使用メモリ 78,052 KB
実行使用メモリ 89,808 KB
最終ジャッジ日時 2023-10-12 09:41:55
合計ジャッジ時間 4,048 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 AC 78 ms
78,048 KB
testcase_05 AC 78 ms
78,084 KB
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 AC 93 ms
80,124 KB
testcase_13 AC 170 ms
88,984 KB
testcase_14 AC 81 ms
78,032 KB
testcase_15 WA -
testcase_16 AC 78 ms
77,940 KB
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
権限があれば一括ダウンロードができます

ソースコード

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(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] + d) % 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:
      s = (n * (n - 1) // 2) % mod * ((mod + 1) // 2) % mod
      ret = K % mod * s % mod * facts[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