はじめに
このシリーズではレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】でまとめられている100問をPythonで解いています。
問題
How many ways?
https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_B&lang=ja
ポイント
この問題は全探索を用いて解くことができます。
問題の解となる3つの数を小さい順にa,b,cと置くと、a + b + c = x でありこの時aの値はxの3分の1よりも
小さいことに注意してください。また、2番目に大きい数のbは x - a を2で割った数よりも小さいです。
このことを用いて、ループ回数を減らすのが今回のポイントになるかと思います。
コード
def main():
while True:
N, X = map(int, input().split(" "))
if N == X == 0:
break
count = 0
for i in range(1, X//3+1): # 一番小さい数のループ
for j in range(i+1, X-i//2+1): # 二番目に小さい数のループ
l = X - i - j # 三番目は一意に定まる
if j < l <= N:
count += 1
print(count)
if __name__ == '__main__':
main()