AtCoder Beginner Contest 131 過去問 (A~C)

参照

atcoder.jp

A問題

2~3分。

S = list(input())
for i in range(1,4):
  if S[i]==S[i-1]:
    print('Bad')
    exit(0)
print('Good')

B問題

10分くらい。
汚いコードでの実装はすぐに思いつきましたが、
簡潔なコードを書きたかったので、10分以上かかってしまいました。

N,L=map(int, input().split())
lis = [L+(i+1)-1 for i in range(N)]
A = list(map(lambda x: abs(x), lis))
print(sum(lis)-lis[A.index(min(A))])

C問題

茶色問題。
15~20分以内に解けました。
A以上B以内の整数のうち、CでもDでも割り切れない整数の数を答える問題です。
普通にループを回したらTLEとなります。

CでもDでも割り切れない場合、
全体 - (Cで割り切れる数+Dで割り切れる数-CとDの最小公倍数で割り切れる数)をすれば良いです。

最小公倍数の出し方はこちら。
www.planeta.tokyo

ユークリッドの互除法が由来となっているアルゴリズムなので、
数値は大きくともTLEされるほどではないです。
(CとDの商と剰余を繰り返し計算する程度の計算量)

A,B,C,D=map(int, input().split())
 
import fractions
lcm = C*D//fractions.gcd(C,D)
min_ = A-1
print((B-min_)-((B//C-min_//C)+(B//D-min_//D)-(B//lcm-min_//lcm)))