結果
| 問題 |
No.271 next_permutation (2)
|
| コンテスト | |
| ユーザー |
maspy
|
| 提出日時 | 2020-05-14 19:52:09 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 620 ms / 2,000 ms |
| コード長 | 1,799 bytes |
| コンパイル時間 | 98 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 20,160 KB |
| 最終ジャッジ日時 | 2024-09-15 18:56:08 |
| 合計ジャッジ時間 | 4,283 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
class BinaryIndexedTree():
def __init__(self, seq):
self.size = len(seq)
self.depth = self.size.bit_length()
self.build(seq)
def build(self, seq):
data = seq
size = self.size
for i, x in enumerate(data):
j = i + (i & (-i))
if j < size:
data[j] += data[i]
self.data = data
def get_sum(self, i):
data = self.data
s = 0
while i:
s += data[i]
i -= i & -i
return s
def add(self, i, x):
data = self.data
size = self.size
while i < size:
data[i] += x
i += i & -i
N, K, *P = map(int, read().split())
bit = BinaryIndexedTree([0] * (N + 1))
A = []
for x in P:
bit.add(x, 1)
A.append(x - bit.get_sum(x))
A = A[::-1]
def g(N, MOD, x):
# とりあえず愚直実装
# return sum(i % MOD for i in range(x, x + N))
ret = -x * (x - 1) // 2
N += x
x = 0
q, r = divmod(N, MOD)
ret += q * (MOD - 1) * MOD // 2
ret += r * (r - 1) // 2
return ret
def f(N, MOD, rep, x, rest):
# x, x, ..., x, x+1, x+1, ..., x+1, % MOD の和
# N 項までとる。最初の rest 項は定数。rep 回ずつ。
ret = 0
n = min(N, rest)
N -= n
ret += x * n
x = (x + 1) % MOD
q, r = divmod(N, rep)
ret += g(q, MOD, x) * rep
x = (x + q) % MOD
ret += x * r
return ret
INF = K + 10
rest = 1
fact = 1
answer = 0
for i, x in enumerate(A):
answer += f(K, i + 1, fact, x, rest)
if rest < INF:
rest += fact * (i - x)
if fact < INF:
fact *= (i + 1)
MOD = 10**9 + 7
print(answer % MOD)
maspy