自分用メモ

プログラミングとかのメモを書きたいです

競プロ典型 90 問:069 - Colorful Blocks 2(★3)

問題

atcoder.jp

挑戦結果

  • 挑戦日:2021/10/29
  • 結果:解けた
  • 時間:15分

考えたこと

  • 1ブロック目:Kパターン、 2ブロック目:K-1パターン、 3ブロック目以降:K-2パターン なので、これをかければ良い。modを取れば大きな数字ならないので、速度面も問題ないはず。
  • 実装したらTLEだった。
  • ループがN回(N乗)だけど、Nは 10 ^ {18} と大きかったことに気がついた。
  •  K ^ {N} を N回のループの計算するのではなく、  K^ {2} →二乗→  K ^ {4} →二乗→  K ^ {8} とやって、logNの計算量で求めるやつだなと思ったけど、Pythonにはライブラリ化されていた気がしたので、ググった。
  • pow(x,y,z) で、  x ^ {y} をzであまりをとった値になることがわかったので、これに変更してAC。

公式解説

https://twitter.com/e869120/status/1405659999179722754

解説を読んだふりかえり

  • 繰り返し二乗法
  • powを使ったけど、自分でも実装できるようになったほうが良いのかもしれない。

ソース

N, K = [int(x) for x  in input().split()]
MOD = 10**9 + 7

if N>=2:
    ans = K * (K-1) * pow(K-2, N-2, MOD)
    ans %= MOD
elif N==1:
    ans = K 
    
print(ans)