全探索 atcoder

ABC051 B - 3つの整数の合計

ABC051 B - 3つの整数の合計
Feb. 2, 2020, 1:52 p.m.

目次

問題

https://atcoder.jp/contests/abc051/tasks/abc051_b

整数KとSが与えられて、$0 \leq X, Y, Z \leq K$である3つの整数X, Y, Zについて$X + Y + Z = S$を満たす組み合わせの数を求める問題.

解説

単純にX, Y, Zの全組み合わせを試して条件を満たすものをカウントすると、$O(K^3)$となる.
Kは最大2500なので計算ステップ数は$10^{10}$以上となり間に合わない.
そこで一工夫してZを$X + Y + Z = S$を解いて$O(1)$でもとめ、そのZが$0 \leq Z \leq K$を満たす場合カウントすれば良い.
全体的には$O(K^2)$で解くことが出来る.

計算量

$$O(K^2)$$

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define MAX_K 2501
#define MAX_S 3 * MAX_K

Int K, S;

void input() {
  cin >> K >> S;
}

void solve() {
  Int count = 0;
  loop(x,0,K+1) {
    loop(y,0,K+1) {
      Int z = S - x - y;
      if (0 <= z && z <= K) count++;
    }
  }
  cout << count << endl;
}

int main(void) {
  input();
  solve();
}