けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

鉄則本 A05 - Three Cards (5Q, ★2)

計算時間の意識が必要になる問題! 鉄則本の問題なのでメモ程度に。

問題概要

赤・青・白の 3 枚のカードがあり、それぞれに 1 以上  N 以下の整数を書き込む。

3 枚のカードの数の合計を  K にする書き方は何通りあるか?

制約

  •  1 \le N \le 3000
  •  3 \le K \le 9000

メモ

赤・青・白のカードに書き込む整数を  x, y, z としよう。このとき

 x + y + z = K

という関係が成り立つ。よって、 x, y の値を決めると、 z の値が決まる。このことを利用して計算量を改善しよう。

詳細は鉄則本参照。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, K;
    cin >> N >> K;
    
    int res = 0;
    for (int x = 1; x <= N; ++x) {
        for (int y = 1; y <= N; ++y) {
            int z = K - (x + y);  // 残りカード
            if (1 <= z && z <= N) ++res;
        }
    }
    cout << res << endl;
}