ABC162 復習

atcoder.jp

A問題

文字列に7が含まれているかどうかです。
pythonなら、forとifが書ければ解けますね。

n = input()

for i in n:
    if i == '7':
        print('Yes')
        break
else:
    print('No')
        

B問題

かの有名なFizzBuzzですね。問題では数値の和を出力するように少し変わっていました。
これも同じく、ifとfor、あとは剰余の求め方がわかれば解けますね。

n = int(input())

ans = 0
for i in range(1, n + 1):
    if i % 3 == 0 and i % 5 == 0:
        continue
    elif i % 3 == 0:
        continue
    elif i % 5 == 0:
        continue
    else:
        ans += i

print(ans)

C問題

最大公約数の問題ですね。これ、解けませんでした・・。
というより難しく考えすぎてしまいました。愚直に書くと、N3の計算量なのでなんらかショートカットを踏む問題なのかと思いきや、普通に3重ループで解けるんですね・・。
制約はちゃんと見ましょう。(戒め)

import math

k = int(input())

ans = 0

for i in range(1, k + 1):
    for j in range(1, k + 1):
        temp = math.gcd(i, j)
        for l in range(1, k + 1):
            ans += math.gcd(l, temp)

print(ans)

D問題

さて、ここからはいつものように全然わからん問題です。
解法を見てもわかるように、問題文そのまま書こうとするとダメなやつですね。
今回で言えば条件に合致する個数を調べるというより、2つある条件のうち、1つに合致するものから、2つ目の条件に合致しない個数を引くという、ちょっとした発想の転換が必要でした。
まだまだ修行が足りんです。

N = int(input())
S = input()

r = S.count('R')
g = S.count('G')
b = S.count('B')

count = 0
for i in range(N):
    for j in range(i + 1, N):
        #2つ目の条件であるj - i ≠ k - jを満たさない数を求める
        #j - i = k - j の場合を調べる必要があるので、k = j + j - iとなる
        k = j + j - i
        if k >= N:
            break
        #2つ目の条件に合致しないことがi, j, k より明らかなので、1目の条件に合致しなければダメ
        if S[i] != S[j] and S[j] != S[k] and S[i] != S[k]:
            count += 1
#1つ目の条件に合致する総数はr * g * bなので、2つ目の条件に合致しない数を引けば答えとなる    
print((r * g * b) - count)

E問題

解説見てもさっぱりわからん。今回はここまで。