3完。何もしてないのに入茶した。
C
提出一覧をコードサイズ順に見ていくと脳筋実装が多くて面白かった(小並)。
なんかgzipで圧縮してる人もいた。
あとcargo-atcoderの提出なんやこれ……。
D
コンテスト終了後に解説を見たときは全くわからんかったが,翌朝に読み直すと難しいことは言ってなかった。
朝型の人間にABCはつらい。
以下,前提知識。
Note
繰り返し2乗法
冪乗の計算は普通に再帰でやるとO(n)だけど,ちょっと工夫するとO(logn)にできる。
an=⎩⎨⎧aa⋅an−1(a2n)2if n=1if n>1 and Odd(n)if Even(n)
このアルゴリズムの行列への応用,編入試に出てたんだよなぁ……。
ああ逃れられない!(カルマ)
Note
剰余乗算
こんな感じのやつ。
俺習ってねーし……。
(amodn)modn(a+b)modnabmodn=amodn=((amodn)+(bmodn))modn=((amodn)(bmodn))modn
cf. 剰余演算 - Wikipedia
VNの計算に繰り返し二乗法のアイデアを適用する。
Nの桁数をKとすると,Nをi個つなげた整数f(N,i)は
f(N,i)=⎩⎨⎧Nf(N,i−1)⋅10K+Nf(N,2i)⋅102iK+f(N,2i)if n=1if n>1 and Odd(n)if Even(n)
と表せる。
剰余乗算の同一性より,f(N,i)modPは
f(N,i)modP=⎩⎨⎧NmodP(f(N,i−1)⋅10K+N)modP(f(N,2i)⋅102iK+f(N,2i))modPif n=1if n>1 and Odd(n)if Even(n)
であり,いい感じに計算量を減らせる。
VN=f(N,N)modPより,答えが出せる。
最初マジで何言ってんのかわからんかった。
ていうか今でもわからん。
等比級数の和のmodを数学的にゴニョゴニョしてるんだろうなとガタイで分析。
数学わからん。
E
解法1: DFS
累積和的にDFSすればいいらしい。
そのうちやる。
解法2: SCC
そのうちやる。
強連結成分分解って現実世界のどこで使われてるんだろう……。
Haskellの処理系で使われていることは知ってる。