1
1

ABC356をPythonで(A~D)

Posted at

AtCoder Beginner Contest 356の解答等をまとめました

A問題

言われたとおりにする

A
n, l, r = map(int, input().split())

ans = [i for i in range(1, l)] + [i for i in range(r, l - 1, -1)] + [i for i in range(r + 1, n + 1)]

print(*ans)

B問題

forループで計算する

B
n, m = map(int, input().split())

a = list(map(int, input().split()))

for _ in range(n):
    b = list(map(int, input().split()))
    for i in range(m):
        a[i] -= b[i]

print("Yes" if all(a_i <= 0 for a_i in a) else "No")

C問題

bitを使って正しい鍵のパターンを全通り用意し、シミュレーションする

C
n, m, k = map(int, input().split())
ok, ng = [], []
for _ in range(m):
    c, *a, r = input().split()
    if r == "o":
        ok.append(list(map(lambda x: int(x) - 1, a)))
    else:
        ng.append(list(map(lambda x: int(x) - 1, a)))

ans = 0
for bit in range(1 << n):
    flag = True
    for ok_i in ok:
        cnt = 0
        for i in ok_i:
            if bit >> i & 1:
                cnt += 1
        if cnt < k:
            flag = False
    for ng_i in ng:
        cnt = 0
        for i in ng_i:
            if bit >> i & 1:
                cnt += 1
        if cnt >= k:
            flag = False

    if flag:
        ans += 1
    
print(ans)

D問題

2進数の桁ごとに考える
公式解説と同じような解法なので貼り付けときます

D
n, m = map(int, input().split())
mod = 998244353
ans = 0

for i in range(59, -1, -1):
    if m >> i & 1:
        if n >> i & 1:
            ans += n % (2 ** (i + 1)) - (2 ** i) + 1

        ans += n // (2 ** (i + 1)) * (2 ** i) % mod
        ans %= mod

print(ans)
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1