はまやんはまやんはまやん

hamayanhamayan's blog

sumsumsum [OyamaC]

https://www.hackerrank.com/contests/oyamac/challenges/sumsumsum

解説

https://www.hackerrank.com/contests/oyamac/challenges/sumsumsum/submissions/code/1321978637

まずは全探索を考えてみよう。
ABCDxyzは全部整数でなので、等式になるためにはxyzも最大はDまで考えればいい。
よって、xyzの全探索は109通りとなる。
これは間に合わない。

少し工夫をしよう。

Ax + By + Cz = D  
Cz = D - Ax - By  
z = (D - Ax - By) / C  

このように変換してみると、xyが決まればzは一意に定まることが分かる。
なので、等式を満たすxyzを全探索するにはxyの全探索で106通りを考えればいい。
これは間に合う。

よって、xyを全探索し、zが整数で0以上のものを答えとしてカウントしていくと答え。

int A, B, C, D;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> A >> B >> C >> D;

    int ans = 0;
    rep(x, 0, D + 1) rep(y, 0, D + 1) if ((D - A * x - B * y) % C == 0) {
        int z = (D - A * x - B * y) / C;
        if (0 <= z) ans++;
    }
    cout << ans << endl;
}