結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

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