ABC146

A

曜日を格納した配列を作っておいて、入力と一致したら対応する値を出力すればよいです。

Submission #8612614 - AtCoder Beginner Contest 146

B

各文字ごとに丁寧にN回インクリメントすればよいです。

Submission #8612571 - AtCoder Beginner Contest 146

C

d(N)(=c)を固定します。このとき、c桁の整数であって、値が\frac{X-cB}{A}以下である整数を買うことができます。そのような整数のうち、最大のものが答えの候補です。cは1から10まで試せばよいので間に合います。(19まで試したしまったけど...。)

Submission #8612542 - AtCoder Beginner Contest 146

D

まずKの値がいくつになるかを考えます。次数がdの頂点があったとき、その頂点に関する条件を満たすためにはd\leq Kでなければなりません。つまり、次数の最大値がKの下界です。逆にKが次数の最大値であるような辺の塗り方が作れることを示します。根を1つ決めてdfsしながら順に塗っていきます。頂点vに来たとき、vの親pとの間にある辺の色を覚えておきます(根の場合は適当に関係ない値にしておく)。この色以外を使ってvの子との辺を塗らないといけませんが、vの子の数はK-1以下であり、K-1色使っていいのでそれらを好きに塗ればよいです。あとは実装力勝負でしょう。

Submission #8612498 - AtCoder Beginner Contest 146

E

難しいと思いました。区間[a,bの和をS _ {a,b}、その長さをlとすると、ある自然数xがあって、S _ {a,b}=xK+lが成り立つということが条件です。lを移項するとS _ {a,b}-l=xKで、S _ {a,b}-lKで割り切れればよいです。ここでS _ {a,b}=(A _ a-1)+(A _ {a+1}-1)+\cdots+(A _ {b}-1)が成り立つので、新たな数列をB _ i = A _ i-1で定義します。すると、この問題は、「数列B _ iについて、その総和がKで割り切れるもののうち、長さがK未満である連続部分列の数を求めよ」と言い換えられます。これはB _ i \ (mod \ K)の累積和T _ iをとると、T _ a=T_bのとき、T _ b-T _ a0なので、B _ {a+1}からB _ bの和の(mod \ K)は0です。従って、T _ iが同じiをまとめておいて、あとはその差がK未満である組の数を数えればよいです。

Submission #8621948 - AtCoder Beginner Contest 146

F

最短の回数を求めるには、dp _ i:iまでの最短回数、というdpが思い浮かびます。愚直にやるとO(NM)ですが、遷移をこれはセグ木で高速化できます。ところが、今回は辞書順最小の移動手順を求められているので、iを小さい方から埋めると困ってしまいます。しかし、iを大きいほうから埋めるとどうでしょうか?
dp _ 0まで埋まった状態から、辞書順最小の移動手順を求めます。今0にいるときに、条件を満たすような位置は「dp _ 0 = dp _ i +1」を満たすような最小のiです。これはセグ木を用いた二分探索によって見つけることができます。この操作をNにたどり着くまで繰り返せばよいです。全体でO(N(logN) ^ 2)かけてもいいですし、「セグ木上の二分探索」によってO(NlogN)の計算量を達成することも可能です。

Submission #8625619 - AtCoder Beginner Contest 146