結果
| 問題 |
No.2686 商品券の使い道
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-29 22:51:11 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 584 ms / 3,000 ms |
| コード長 | 1,544 bytes |
| コンパイル時間 | 324 ms |
| コンパイル使用メモリ | 82,520 KB |
| 実行使用メモリ | 184,064 KB |
| 最終ジャッジ日時 | 2024-09-30 05:05:58 |
| 合計ジャッジ時間 | 18,209 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 48 |
ソースコード
def or_convolution(A, B, MOD=-1):
n = max(len(A), len(B))
l = (n - 1).bit_length()
n = 1 << l
A += [0] * (n - len(A))
B += [0] * (n - len(B))
def f(A):
for i in range(l):
for bit in range(n):
if bit >> i & 1:
A[bit] += A[bit ^ (1 << i)]
if MOD != -1:
A[bit] %= MOD
def invf(A):
for i in range(l):
for bit in range(n):
if bit >> i & 1:
A[bit] -= A[bit ^ (1 << i)]
if MOD != -1:
A[bit] %= MOD
f(A)
f(B)
if MOD != -1:
C = [a * b % MOD for a, b in zip(A, B)]
else:
C = [a * b for a, b in zip(A, B)]
invf(C)
return C
n, m, q = map(int, input().split())
assert 1 <= n <= 20
assert 1 <= m <= 10**9
assert 1 <= q <= 10**9
A = [0] * n
B = [0] * n
for i in range(n):
a, b = map(int, input().split())
assert 1 <= a <= 10**9
assert 1 <= b <= 10**9
A[i] = a
B[i] = b
C = [0] * (1 << n)
W = [0] * (1 << n)
for bit in range(1 << n):
for i in range(n):
if bit >> i & 1:
C[bit] = C[bit - (1 << i)] + A[i]
W[bit] = W[bit - (1 << i)] + B[i]
break
X = [0] * (1 << n)
Y = [0] * (1 << n)
for bit in range(1 << n):
if C[bit] <= m:
X[bit] = 1
if C[bit] <= q:
Y[bit] = 1
Z = or_convolution(X, Y)
ans = 0
for bit in range(1 << n):
if Z[bit] > 0 and W[bit] > ans:
ans = W[bit]
print(ans)