AGC26
二回目のAGCでした。
A - Colorful Slimes 2
提出コード
まず入力時に、どの色のスライムがいるかを調べます。前から順番にスライムをチェックしていって、一個前のスライムと色が同じだったらその都度色を現時点で使ってない色に変えていけば、最短手数で合体しないスライム達ができあがります。
色を変えた回数を数える変数がbool型になっていて、時間が吸い取られました…自分のレート帯においてこれは本当に痛手でした。
B - rng_10s
提出コード(時間外)
考察はある程度までいったのですが、最後のつめが甘いのと、知識が足りない問題でした。
すぐに答えがわかる条件は3つあり、
のときNo(初日から買えないため)
上記の条件を除き、のときNo(いつか供給がおいつかなくなるため)
上記の条件を除き、のときYes(買えなくなる前に必ず供給されるため)
というものです。自分は、という条件について、現在の本数、という条件にしていたため、複雑化してしまいました。
次に、すぐに答えがわからない条件、すなわち上の3つのパターン以外の時に、ジュースが買えなくなる条件はどうなるか、という問題について考えます。
という条件のもとでジュースが買えなくなるのは、
- 夜の時点での残り本数が、より多いが、次の日にジュースを買うことはできない(より小さい)
という状況です。逆にいうと、残り本数がBより少ない時に入荷を必ず行えば、ジュースを買い続けることができます。
また、この状況について考えるとき、夜の時点で残り本数がより多い時、夜に入荷はせず、次の日に本買う、という作業しか発生しないため、で割ったあまりのみを考えていいことがわかります。すると、
残り本数
という条件に置き換えることができます。
ジュースを買い続けることができるとき、夜の時点での残り本数は、どこかでかならず初日の夜と同じになり、それ以降はループします。なので、一番厳しい条件である、残り本数をで割ったあまりの最大値だけについて調べ、その時でも以下であれば、答えがYesになります。つまり、
残り本数のとりうる最大値ならばYes
です。
さて、残り本数をで割ったあまりの最大値についての調べ方を考えます。
をで割ったあまりを、をで割ったあまりをとします。
ある日の残り本数は、その前日の残り本数にを加えて、で割ったあまりになります。最初に以下となるべき日の残り本数は、です。
残り本数の最大値を、図を使って考えてみることにします。で割ったあまりのみを考えるので、ある円について、円周上に個の点を置き、それぞれの点に時計回りに0からまでの数字をつけてあげます。つまり、ある点の数字に1足すと時計回りに1つ進み、に1を足すと0になるような円を考えます。このとき、をスタート地点としてずつ進んでいったときに通れる点の中で、一番数字が大きい点はどこか?という問題になります。
では、あらためて残り本数のとりうる最大値を求めていきましょう。
わかりやすくするために、スタート地点が0の時をまず考えます。
スタート地点に戻ってくるために必要な移動回数は、との最小公倍数をとして、
回
となります。(移動回数とをかけたものがの倍数になれば、で割ったときのあまりが0になり、スタート地点に戻ります。の倍数になる最小の数字は、最小公倍数そのものです。)また、スタート地点に再びもどってくるまでに、ほかの地点に2回以上訪れることはありません。なぜなら、もし2回以上訪れると仮定したとき、その地点をスタート地点とすると、1ループが上記の回数未満でおこっていることになり、矛盾するからです。
0をスタート地点としたときの、残り本数のとりうる最大値を、二つのパターンにわけて考えます。とが互いに素であるときと、そうでないときです。
* とが互いに素であるとき
となるので、 回移動すると、1回のループがおこります。ですが、先ほど述べたように、1回のループでは同じ点を1回しか訪れないため、全ての点に1回ずつ訪れていることになります。
このとき、訪れる点の中で一番大きい数字はというと、0からの中での最大はもちろん
になります。
* とが互いに素でないとき
との最大公約数をと表記すると、は次のように表現できます。
なので、ずつ移動していくと、1ループまでに回移動することになります。
1回のループでは同じ点を1回ずつしか通らないため、通る点の数字のパターンは次のように置き換えることができます。
0からスタートして、ある間隔だけ回移動したときに、ちょうど1周して0に戻るようなを求めれば、の倍数が、ずつ移動したときに通る点の数字と同じになります。はすぐに求まります。回移動したときにちょうど1周して0に戻るには、移動した距離の合計がになるようにしなければならないので、
より、
となります。
さて、ずつ移動して、1回ループしたときに通る点の数字の中で最大のものはいくつでしょうか?答えは次のようになります。
以上で、0がスタート地点のときの、残り本数のとりうる最大値が求まりました。とが互いに素のとき、は1になるので、互いに素であっても最大値はと表記できるようになります。
では、最後にスタート地点が0ではなくだったときについて考えます。
例えば、だったとき、スタート地点はだけずれますが、通る点の数字はの倍数なので、スタート地点が0のときと同じです。
同様にして、だったとき、スタート地点はのときを考えるのと同じになります。これをくりかえすと、をでわったときのあまりをスタート地点にした場合の最大値を求めればよくなります。
をでわったときのあまりをと書くことにします。このとき、であることは明らかです。よって、求めたい最大値はになります(先ほどの条件より、この値がBを超えることはないので、これが最大値になります)。
長くなりましたが、最後の条件は次のようになります。
のときNo
最初の条件とあわせて、
となります。
今回もやまさん(@yamasangamasan)にすこし解説してもらいました!数学系に強い人、うらやましいですね~。
C - String Coloring
提出コード(時間外)
最初読んだときに、これICPCのD問題っぽい!と思ってとりあえず全探索したのですが、通るわけありませんでした…その後はB問題に戻ったので、解けませんでした。
解法としては、文字列を前半と後半に分けて、後半だけ前後反転した後に、赤と青の色分けをすべてのパターン行い、その文字列のペアを、そのペアの出現回数とともに前半と後半それぞれのマップに格納します。そして、全探索が終わったら、前半にある文字列のペアが、後半にもあるかどうかを調べ、あったときにはその出現回数の積をカウントしていきます。調べおわったらカウントした数が答えになります。
半分にわけて全探索は有名らしい(?)ですが初めてだったので歯が立ちませんでした…
D以降は問題を見ていないので省略させていただきます。
というわけでまだまだ実力不足感が否めないので、数をこなして水色になりたいですね!