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

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

AtCoder ABC 046 B - AtCoDeerくんとボール色塗り (6Q, 茶色, 200 点)

高校数学ではお馴染みの塗り分け問題!

問題概要

 N 個のボールが一列に並んでいる。これらのボールを  K 色を使って塗り分ける。ただし、隣り合うボールの色は異なる色にしなければならない。何通りの塗り方があるか?

制約

  •  1 \le N \le 1000
  •  2 \le K \le 1000
  • 答えは  2^{31} - 1 以下

考えたこと

高校数学ではお馴染み!!!
ボールの色を塗るとき、左端から順に塗っていくことにする(このように順序を決めることは大事)。


  • まず、左端のボールの塗り方は  K 通り考えられる。
  • 次に、その右隣のボールの塗り方は  K-1 通り(左端と異なる必要があるため)
  • 次に、その右隣のボールの塗り方は  K-1 通り(左端と異なる必要があるため)
  • ...
  • 最後に、右端のボールの塗り方は  K-1 通り(左端と異なる必要があるため)

というわけで、答えは

 K \times (K-1) \times (K-1) \times \dots \times (K-1) = K(K-1)^{N-1} 通り

と求められる。

コード

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

int main() {
    int N, K;
    cin >> N >> K;

    int res = K;
    for (int i = 0; i < N-1; i++) res *= K-1;
    cout << res << endl;
}