ABC275 (2022/10/29)
https://atcoder.jp/contests/abc275/tasks
〇A問題
CarpDay.icon index使い慣れていないので,線形探索しました.
Yuto.icon簡単
〇B問題
CarpDay.icon Pythonだと問題作成者の意図が意味なくなるなぁ,と少し罪悪感
Yuto.iconlambdaでmod取るのをmapすれば綺麗に書ける
https://scrapbox.io/files/635d2f636e69940023c7799f.png
list(map(int, input().split()))で良いのでは?
Yuto.icon pythonだとOverFlowの心配はないですが,計算量は桁数に従って増えるので,TLEがあるかもと考えて念のためMODを取りました.
えらい!
〇C問題
CarpDay.icon 斜めに気付かず,「簡単」と思ったら,例1から斜めがあって...結構考えました.
Yuto.icon私も最初は回転したものを考慮しておらず,test case.1でWAを出してようやく気付きました.回転を考慮すると$ 全探索:O(81^4) = O(43046721) = O(10^8)しか思い浮かばず,解けなかった.今思うとこれくらいの計算量ならC++使えば通せたかも
〇D問題
CarpDay.icon 2日前の知能情報学セミナーで「学んだ」ことを使わせてもらいました(^^)/
Yuto.icon2日前の知能情報学セミナーで「布教」したことがそのまま出て面白かったです
〇E問題
CarpDay.icon DPで場合の数を数えればOK.でも確率をMODで表す方法が分からず苦労しました.Web検索して,流用してなんとかAC!初めてEまで解けました!https://math.nakaken88.com/textbook/cp-modulo-operation-inverse-element/
Yuto.iconまたしても期待値dpにやられた...惜しいところまでは行った気がする.
上で紹介されていたサイトを見た.問題文⇩の意味が分からなかったけど,これが逆元なんですね.
https://scrapbox.io/files/635e03231106a2001d1df9e3.png
「逆元」とか言うやつ,今まで名前は聞いたことあったけどよく分かって無かったので,この機会に少し勉強してみた.
C++なら,<atcoder/modint?>というライブラリを使えば何も気にしなくても?やってくれそう
Python(ver3.8 or later)なら,組み込み関数のpowを使うと計算できるらしい.
逆元の数学的な定義はまだ理解できていないけど,使うだけなら出来そう?
逆元について
このサイトが分かりやすかった
CarpDay.icon 直観的には,行列演算における逆行列のイメージ.行列は+,ー,×は計算できるけど,÷は存在しない.剰余算も同じで+,ー,×は使えるけど,÷は使えない.
$ AX=Bを満たす$ Xを求めたいのに,$ X=B/Aができないので,$ /Aの代わりに$ A×A^{-1}=1(行列だと1ではなく単位行列)を満たすような$ A^{-1}を考えて,$ X =BA^{-1}で求めよう!という考え.この$ A^{-1}が$ Aの逆元になる.
今回の問題だと分数を使う必要があって,例えば1/2に対しては,1×(2の逆元)を求めることになる.mod 998244353における2の逆元を求めるのに指数計算が必要になる(詳しくは上記のリンク参照).
競技プログラミングとして割り切れば,分数に対してMODを使うような問題に対しては,予め逆元を求めるライブラリを用意しておいて対応するのが良さそう.
Yuto.icon ↑分かりやすい説明ありがとうございます.逆行列というのがイメージしやすかったです.
#AtCoder #ABC #メモ化再帰 #DP #期待値DP #逆元 #Mod(剰余算)