089 E - Colorful Hats 2¶
- created: 2022-12-19 mon
- ご意見・ご要望はissue・プルリク用のGitHubまで
- 競技プログラミングのためのF#入門
- GitHub上の対応ディレクトリ
- 公式ページ
- 要点: アルゴリズムの検討
入出力¶
1 2 3 | |
解説¶
公式解説通りに実装します.
MOD計算¶
計算漏れしないように演算子を定義してそれを使いましょう.
1 2 | |
MODはInt32でも問題ないと思いますが, たまにオーバーフローしてはまり倒すため, 怪しそうな場合はとにかくInt64に倒します.
大枠¶
各iごとに計算した結果をかけて積んでいけばよく, 単純にArray.foldでループを回します. 変数名は公式解説に合わせます.
積む変数は最終的な計算用の値であるTiとxi,yi,ziです. 前の人までの帽子の値が必要なためxi,yi,ziもStateに積む必要があります. 初期値はかけ算の初期値だからTi = 1, 帽子の数は(xi,yi,zi) = (0,0,0)でよく, 特に次のように書けます.
1 2 3 | |
最終的に必要なのはtの値だからそれをfstで切り取ります. タプルを切り取るのはfstとsndまでしかないため, この最後の切り取りが単純になるようにStateを構成しています.
folderの構成¶
まずtを更新します. filterとlengthを組み合わせるのが素直な実装です. ここではsumByで次のように処理します.
1 | |
いまはInt64でtを積むため, filter >> lengthで処理する場合は最後にint64をかませる必要があります.
次は(x,y,z)の更新です. これは単純な場合分けで十分です.
1 | |
あとはこれらの値をタプルにまとめて次のステップに回します.
1 | |
MODつきのかけ算にするよう注意しましょう.
まとめ¶
ここまでの処理をまとめると次のように書けます.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |