不定期プログラミング覚え書き

青コーダーと黄コーダーの間を彷徨う社会人プロコン勢が余力のあるときに復習した内容をまとめるブログ

yukicoder #358: も~っと!門松列

yukicoderの結果を書こうとしてふと気付いたれど、コンテスト参加ごとにブログ記事をまとめる必要って無いですね(解けない問題の処理とか確かに困ってたし)。
今後は問題ごとに記事をわけて書いていきたいと思う。

考えたこと

 (A_0, A_1, A_2)が与えられた時に  B=(A_0 \% p, A_1 \% p, A_2 \% p) が門松列となるようなpの個数を求める問題。
pが \max(A_0,A_1,A_2)よりも大きくなると任意のpでB=(A_0,A_1,A_2)になるため、これが門松列である場合は解は無限個。
逆に言えばそうでない場合はpが \max(A_0,A_1,A_2)以下であるケースを数え上げれば良い。

コード

プロコンで初めてラムダ式使いました。
門松列判定行列は関数化すれば良かったと書いてから後悔しました。

A=map(int,raw_input().split())
MA= max(A)
if A[0]==A[1] or A[1]==A[2] or A[0]==A[2]:
    print 0
elif A[0]<A[1] and A[1]>A[2]:
    print "INF"
elif A[0]>A[1] and A[1]<A[2]:
    print "INF"
else:
    ans=0
    for i in range(1,MA+1):
        B=map(lambda x:x%i,A)
        if B[0]==B[1] or B[1]==B[2] or B[0]==B[2]:
           continue
        if B[0]<B[1] and B[1]>B[2]:
           ans+=1
        elif B[0]>B[1] and B[1]<B[2]:
           ans+=1
    print ans