ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

【AtCoder版!蟻本】ABC051 B - Sum of Three Integers【準備編】

f:id:ebisuke33:20210317160759p:plain
AtCoder版!蟻本の準備編で類題としてあげられているABC051 BをPythonで解いていきます。

atcoder.jp

AtCoder Beginner Contest 051 B - Sum of Three Integers

問題文

2 つの整数 K,S が与えられます。
3 つの変数 X,Y,Z があり、0≦X,Y,Z≦K を満たす整数の値を取ります。
X+Y+Z=S を満たす X,Y,Z への値の割り当ては何通りありますか。

制約

・2≦K≦2500
・0≦S≦3K
・K,S は整数である。

解答例

k, s = map(int,input().split())

# 条件を満たす組み合わせの数
ans = 0

# 全探索
for x in range(k+1):
    for y in range(k+1):
        z = s - x - y
        if z >= 0 and z <= k:
            ans += 1

print(ans)

解説

k以下の正の整数x,y,zがあり、x + y + z = sを満たす組み合わせの数を答える問題です。

x,y,zの3重ループにすると計算量が多くなりますので、xとyの2重ループになるよう工夫が必要です。
x + y + z = s から z = s - x - y と式変形できます。
なので、xとyが決まれば候補となるzが求まり、この候補が条件を満たすか(正の整数でk以下か)を判定します。
条件を満たせばansに1を足していけば、ループを抜けたあとのansが求める解答です。



AtCoder版!蟻本(初級編)の記事リンクページはこちら
ebisuke33.hatenablog.com