tukki Diary

地方公務員。某校でプログラミングの先生をしてます。

AtCorder Beginner Contest 103 に参加した!

用事ない限り参加することにしてるAtCorder!

ABC103に参加してました!

AtCoder Beginner Contest 103 - AtCoder

 

言語はpython3、競プロはjavaとかのコンパイラ言語の方が良いらしいけど書けません!

 

A問題 略

 

B問題

S = list(input())
T = list(input())
Ans = False

for i in range(len(S)):
S.insert(0,S[-1])
S.pop(-1)
if S == T:
Ans = True
break

if Ans == True:
print('Yes')
else:
print('No')


popとinsertで文字を入れ替えていき、一致するものがあれば元々FalseのAns を Trueに変えてbreak
最初にbool型の変数を作っておくと便利ってどこかで見て覚えましたw



C問題

import math
from functools import reduce

N = int(input())
A= list(map(int,input().split( )))

def gcd(x,y):
    if x > y:
        x , y = y , x
    while x>0:
        x, y = y%x , x
    return y
    
def lcm_base(x, y):
    return (x * y) // gcd(x, y)

def lcm_list(numbers):
    return reduce(lcm_base, numbers, 1)

m =  lcm_list(A) -1

B = 0

for j in range(len(A)):
    B += m%A[j]

print(B)

与えられた数字の最小公倍数から1を引いた値が非負整数mってことに気づいて、最小公倍数の出し方をネットで調べると

#最大公約数
import math
math.gcd(x, y)

#最小公倍数
lcm(x, y) = x * y / gcd(x, y)


3つ以上の最小公倍数は2つづつ再帰的に演算して、

import math
from functools import reduce
    
def lcm_base(x, y):
    return (x * y) // gcd(x, y)

def lcm_list(numbers):
    return reduce(lcm_base, numbers, 1)


note.nkmk.me


これでイケた!!って喜んで提出したらREの嵐。間違っとるらしい。
何がおかしいんやろって考えると、どうも最大公約数に使ったmathのgcd(x,y)は
python3.5以降でのサポートだが、AtCorderのはpython3.4.3ってのが原因っぽい。
3.4環境でgcd(x,y)が入ってるfractionsをimprortして見たけど、何かおかしいらしくエラー。
手元のPCでは3.4環境での確認なんて出来ないしw

観念して、ユークリッドの控除法を利用してgcd(a,b)を定義し直して提出したら何とかAC!通った!
morizyun.github.io


修正+修正ミスでのペナルティー×3で30分くらい時間伸びたけど、とりあえずC問題初めて解けて満足。

Dは書き出して行って何となーく方向性のイメージは出来たけど、プログラム書き上げる時間は無くて終了。

まあ、まだまだ修行が必要ですね〜


終わってから他の人のC問題の回答見てると、なんか異様に回答が短い人がちらほら。
たとえばこんな感じの

n=int(input())
a=list(map(int,input().split()))
print(sum(a)-n)

え、最小公倍数とか必要なかった?入力2行に出力1行?ってどういうこと?って思ったんですけど、
余りの最大値は割った数-1だから、割った数の合計値から「割った数」の数(与えられるn)を引けば出るんですね。
公式解答も同じ。
全然気が付かなかった・・・


とりあえず、今回はこんな感じ。復習にもなって良いから毎回書いていこう!目指せ水色ランク!