Port 53

明日のための技術メモ

AtCoder ABC172

AtCoder ABC172解いた分だけまとめ。
Cから緑Diffだった。結果AB2完で終わってしまった。
レート激冷えしたけど茶色は守れてる。
CとDは解説ACで、Cでしゃくとり法が出たのでCだけ別記事にする。

目次

解説AC

A. Calc

f:id:saturn-glave:20200708234134p:plain

問題文

やるだけ。Aのn乗は A ** n と書ける。

ACしたコード

# coding:utf-8
a = int(input())
print(a + a**2 + a**3)

B. Minor Change

f:id:saturn-glave:20200708234416p:plain

問題文

2つのリストを1文字ずつ見ていって、差分があればカウントするだけ。

ACしたコード

# coding:utf-8
s = list(input())
t = list(input())

if s == t:
    print(0)
else:
    ans = 0
    for i in range(len(s)):
        if s[i] != t[i]:
            ans += 1
    print(ans)

C. Tsundoku

f:id:saturn-glave:20200708235207p:plain

問題文

ここから解説AC。今回は累積和としゃくとり法の組み合わせにした。
(累積和と二分探索でもいけるらしいが、まとめられればまた別でまとめることに。)
しゃくとり法が初めてだったので、以下の記事にまとめる。

port53.hatenablog.com

D. Sum of Divisors

f:id:saturn-glave:20200708235407p:plain

問題文

sympy使って約数列挙も考えたけどsympy使えない。
解説を読んでいくと、「正の整数 j について、i の倍数かつn以下のものをg(i)とした時、その総和を求める」
問題に置き換えられる。実質、これは等差数列になる。
ここでは j をtmp = n // i として、iを1からnまで動かしながら合計を求める 各g(j)は、 (i * tmp * (tmp + 1)) // 2 となる。

解説ACしたコード

# coding:utf-8
n = int(input())
ans = 0

for i in range(1, n + 1):
    tmp = n // i
    ans += i * tmp * (tmp + 1) // 2
print(ans)

参考

公式解説