結果
| 問題 |
No.2025 Select $k$-th Submultiset
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 18:00:21 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,191 bytes |
| コンパイル時間 | 355 ms |
| コンパイル使用メモリ | 82,704 KB |
| 実行使用メモリ | 106,032 KB |
| 最終ジャッジ日時 | 2025-03-31 18:01:21 |
| 合計ジャッジ時間 | 4,829 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | TLE * 1 -- * 41 |
ソースコード
def comb(n, k):
if n < k or k < 0:
return 0
if k == 0:
return 1
if k == 1:
return n
if k == 2:
return n * (n - 1) // 2
if k == 3:
return n * (n - 1) * (n - 2) // 6
return 0
def count_comb(s, m, c_list):
total = 0
n_subsets = 1 << m
for mask in range(n_subsets):
bits = bin(mask).count('1')
sign = (-1) ** bits
sum_S = 0
for j in range(m):
if mask & (1 << j):
sum_S += c_list[j] + 1
if sum_S > s:
continue
rem = s - sum_S
curr_comb = comb(rem + m - 1, m - 1)
total += sign * curr_comb
return max(total, 0)
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx += 1
L = int(input[idx])
idx += 1
c = list(map(int, input[idx:idx+N]))
idx += N
Q = int(input[idx])
idx += 1
queries = []
for _ in range(Q):
queries.append(int(input[idx]))
idx += 1
total_comb = count_comb(L, N, c)
for k in queries:
if k > total_comb:
print(-1)
continue
remaining_k = k
sum_so_far = 0
result = []
for i in range(N):
current_max = min(c[i], L - sum_so_far)
found = False
for a_i in range(current_max, -1, -1):
s_remaining = (L - sum_so_far) - a_i
if s_remaining < 0:
continue
if i == N - 1:
ways = 1 if a_i == (L - sum_so_far) else 0
else:
m = N - i - 1
c_remaining = c[i+1:]
ways = count_comb(s_remaining, m, c_remaining)
if ways >= remaining_k:
result.append(a_i)
sum_so_far += a_i
found = True
break
else:
remaining_k -= ways
if not found:
print(-1)
break
else:
print(' '.join(map(str, result)))
if __name__ == "__main__":
main()
lam6er