読者です 読者をやめる 読者になる 読者になる

Structured Program II - How many ways?

はい。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_B
1 から n までの数の中から、重複無しで3つの数を選びそれらの合計が x となる組み合わせの数を求める というので3重ループで書いていたのだが他の人の回答を見たら2重ループに出来る方法があって感動したので書いておくことに。

・3重ループの場合

for i in range(1,n-1):
    for j in range(i+1,n):
        for k in range(j+1,n+1):
            if i+j+k==x:ans+=1
print ans

2重、3重がi+1,j+1から開始なのは重複なしの3つの数を使うためです。この3重目が1ずつ加算してxになる数を探すということをする必要が全くなかった。

・2重ループの場合

for i in range(1,n-1):
    for j in range(i+1,n):
#xからiとjを引くことで3つの和がxと等しくなるための数が求まりcに代入しておく
        c=x-i-j
#cがjより大きく(c==jだと3つの数の中で重複が有って、c<jだと数え上げる組合せに重複が出るため)、
#cがn以下(3つ目の数はn以下でないと条件の範囲外になる)であれば組合せを1つ加算して次のループに行く。
        if c>j and c<=n:a+=1
print a