【AtCoder】ABC200をPython3で解説


ABC200の解説。

A - Century

解説

年→世紀を求めるには、年から1を引いて、100で割って、1を足す。

コード

N = int(input())
print((N-1)//100+1)

B - 200th ABC-200

コード1(intのまま)

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

for _ in range(K):
    if N % 200 == 0:
        N //= 200
    else:
        N = N * 1000 + 200

print(N)

intのまま計算する方法。
 Nを1000倍して、200を足すことで実装。

コード2(strに置き換える)

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

for _ in range(K):
    if N % 200 == 0:
        N //= 200
    else:
        N_S = str(N) + '200'
        N = int(N_S)

print(N)

strで数字を足す方法。
 Nをいったん文字列に直して、'200'を文字列として追加し、また、intに戻す。

C - Ringo's Favorite Numbers 2

解説

Ai−Ajが200の倍数ということは、AiとAjを200で割ったあまりが等しいということである。
たとえば、Ai=201,Aj=1とすると、

Ai-Aj=201-1=200
Ai÷200=1...1
Aj÷200=1...1

また、Ai=523,Aj=123とすると、

Ai-Aj=523-123=400
Ai÷200=2...123
Aj÷200=0...123

よって、このことが確かめられる。

この問題は、Aの要素を200で割った余りをRとすると、Ri=Rj(i<j)は何通りあるかということになる。

コード

N = int(input())
# 入力を整数値にして、分けてリストに入れる。
A = list(map(int, input().split()))
Rmd = []

def rfn() -> None:
    # Aの全要素を200で割った余りをRmdに追加
    for x in A:
        Rmd.append(x % 200)

    # [0, 0, 0,... ,0]と0を200個生成
    count = [0] *200

    ans = 0
    # Rmdの要素を一つずつ検証
    for rmd in Rmd:
        # ※補足1
        ans += count[rmd]
        # ※補足2
        count[rmd] += 1

    return ans

if __name__ == '__main__':
    print(rfn())

補足

※1 ans += count[rmd]だが、リストであるcountrmd番目の値をansに加える操作。
例えば、count[123]が1で、ansが0ならば、最終的なansは1となる。つまり、1通りの組み合わせがあるということになる。

※2 値を確認した、ということでcount[rmd] += 1で要素を1つ数える。