5
1

ABC356(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

Posted at

ABC356(Atcoder Beginner Contest)のA~D(A,B,C,D)問題をPythonで解説(復習)

A問題

  • ここ2週間それなりに忙しいので,省略します.ごめんなさい.
  • コメントを見て下さい.
A.py
"""
<方針>
- ここ2週間それなりに忙しいので,省略します.ごめんなさい.
- コメントを見て下さい.
"""

# 標準入力を受け取る.
N, L, R = map(int, input().split())

# 1〜Nまでの数字のリストを作成する.
ans = list(range(1, N+1))

# L〜Rまでを反転する.0-indexedに注意する.
ans[L-1:R] = list(reversed(ans[L-1:R]))

# 空白くぎりでリストを出力する.
print(*ans)

B問題

  • ここ2週間それなりに忙しいので,省略します.ごめんなさい.
  • コメントを見て下さい.
B.py
"""
<方針>
- ここ2週間それなりに忙しいので,省略します.ごめんなさい.
- コメントを見て下さい.
"""
N, M = map(int, input().split())

# 取らなきゃいけない栄養素
A = list(map(int, input().split()))

# 実際に取った栄養素
B = [0]*M

# 食べ物を食べていく.
for i in range(N):
  # i品目を食べる.
  X = list(map(int, input().split()))
  
  # どんな栄養素が取れたかを記録する.
  for j in range(M):
    # j番目の栄養素を記録する.
    B[j] += X[j]

# 全ての栄養素が足りているかを見る.
for i in range(M):
  # 足りない栄養素があった時,
  if(A[i]>B[i]):
    # Noを出力して,プログラムを終了する.
    print("No")
    exit()

# 全ての栄養素が足りている時,Yesを出力する.
print("Yes")

C問題

  • ここ2週間それなりに忙しいので,省略します.ごめんなさい.
  • コメントを見て下さい.
C.py
"""
<方針>
- ここ2週間それなりに忙しいので,省略します.ごめんなさい.
- コメントを見て下さい.
"""

N, M, K = map(int, input().split())

# 試した鍵の種類
AA = []
# 鍵が空いたかどうか
R = []
for i in range(M):
  CAR = list(map(str, input().split()))
  AA.append(list(map(int, CAR[1:-1])))
  R.append(True if CAR[-1]=="o" else False)

ans = 0
# 鍵のパターンを全て試す.
for i in range(1<<N):
  # 矛盾するとFalseが入る.
  ok = True
  # 試した鍵のパターンを全て確かめる.
  for j in range(M):
    # 正しい鍵の数
    col = 0
    for a in AA[j]:
      # 鍵が正しい時,
      if(i&(1<<(a-1))):
        col += 1
    
    # 矛盾したとき,
    if((R[j]) != (col>=K)):
      ok = False
  
  # 矛盾してない時,
  if(ok):
    # 鍵のパターンは合っているものとする.
    ans += 1

# 出力
print(ans)

D問題

  • ここ2週間それなりに忙しいので,省略します.ごめんなさい.
  • コメントを見て下さい.
D.py
"""
<方針>
- ここ2週間それなりに忙しいので,省略します.ごめんなさい.
- コメントを見て下さい.
"""
N, M = map(int, input().split())

MOD = 998244353
# 回数
ans = 0

# Mの各ビットを下から見ていく.
for i in range(60):
  
  # Mとkのi番目のビットが両方とも立つような回数.
  b = 0
  
  # i番目のビットだけを立たせた数字.
  m = 1 << i
  
  # Mのi番目のビットが立っている時,
  if M & m:
    # kが取れる全パターンから,m番目のビットが立っているようなパターン数
    di, mo = divmod(N+1, 2*m)
    # 割った数を足す.
    b += di * m
    # 余りを足す.
    b += max(0, mo - m)
  
  # 答えを足して,MODをとっておく.
  ans += b
  ans %= MOD

print(ans)

補足

関係するリンク(参考文献など)

筆者について

その他

  • 間違いを含んでいる可能性があります.
  • 方針と言いつつ,方針ではない感想などを書いている可能性があります.
  • A問題から解説がだんだん省略されます.
  • コードに書かれている解説の文言と,その上に書いてある解説の文言を変えている場合があります.

最後に一言

  • 先週の記事の最後に一言にも書いたんですけど,ゲキ忙しくて,解説サボってます...ごめんなさい...
5
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
5
1