AGC001-B Mysterious Light 考察と実装

195f71c8183f8d27da66aa0618f293b6?s=47 task4233
February 07, 2019

AGC001-B Mysterious Light 考察と実装

AGC001-B Mysterious LightのEditorialの理解の足しになるように, という思いで作成しました.

195f71c8183f8d27da66aa0618f293b6?s=128

task4233

February 07, 2019
Tweet

Transcript

  1. AGC001-B 考察と実装 @task4233

  2. もくじ 1. 概要 2. 考察 3. 実装 4. まとめ 2

  3. 1. 概要 ・1辺の長さがNの正三角形abcがある. ・不思議な光は, 自分の軌跡と辺に当たったときに反射する. ・頂点aからXだけ離れた点から辺bcと平行な光を放った時,  もう一度その点に戻ってくるまでの軌跡の和を求めよ. 3

  4. 2. 考察 問題がよくわからないので, 問題に与えられた図を用いて一般化してみる. 4

  5. N, Xについて一般化(図はN=5, X=2の時のもの) X N X 5

  6. N, Xについて一般化(図はN=5, X=2の時のもの) X N N-X X 6

  7. N, Xについて一般化(図はN=5, X=2の時のもの) X N N-X X X 7

  8. N, Xについて一般化(図はN=5, X=2の時のもの) X X N-X X 8

  9. N, Xについて一般化(図はN=5, X=2の時のもの) (N-X)-X N-X X 9

  10. N, Xについて一般化(図はN=5, X=2の時のもの) (N-X)-X N-X X (N-X)-X 10

  11. N, Xについて一般化(図はN=5, X=2の時のもの) (N-X)-X (N-X)-X (N-X)-X 11

  12. N, Xについて一般化 先ほどまでの図で反射した光に周期性があったことが分かるは ず. その周期性とは以下の3つ. 1. 2回反射した後の領域に, 平行四辺形が出現すること 2. N,

    N-Xの後の反射において, 2回ずつ同じ距離を進むこと 3. 出来た平行四辺形の辺が等しい時に, 反射が終わること それぞれ見ていく. 12
  13. 2-1. 平行四辺形の出現 右下の図は6枚目のスライドの図である. ここで, 光が2回進むと平行四辺形ができることが分かる. なお, その辺の長さは 前の2つの光の軌跡の距離と一致する. (右の図で言えば, XとN-Xになる)

    X N N-X X 13
  14. 2-2. 同じ距離の軌跡 右下の図は8枚目のスライドの図である ここで, X->N-Xの軌跡の後に, X->Xのように同じ距離だけ進んでいることが分かるはず. なお, その距離は2-1.で説明した 平行四辺形の辺の最小値である. X

    X N-X X 14
  15. 2.3. 反射の終了 右下の図は11枚目のスライドの図である ここで, 反射が終了する時, 平行四辺形の2辺が等しく なっていることが分かるはず. ((N-X)-X = (N-X)-Xで等しい)

    (N-X)-X (N-X)-X (N-X)-X 15
  16. 3. 実装 2.での考察により, 以下のような再帰が書ける. 出来る平行四辺形の2辺をx, y(x < y)とすると, と書ける. 16

  17. 3. 実装(C++) 実装すると右のようになる. ※int64_tはlong longでも問題ない しかし, これは制約が なのでTLEになる. そこで, 再帰を簡潔にする.

    17
  18. 3. 実装 - 高速化(1) 再帰関数をじーっと見ていると, return f(mn, mx-mn) + 2

    * mn の部分が無駄に見えてくる. (なぜなら, mx-mnというパラメータの関数を呼び出す度に2*mnを 加算するので, その加算をまとめて[mx/mn]* 2 *mnとすればまと められるから) ※[ ]はガウス記号. 18
  19. 3. 実装 - 高速化(2) すると, 先ほどの再帰は以下のように書き直せるはず. なお, y%x=0の式で最後にxを引いているのは, 再帰の終了時に光が平行四辺形の半分だけ進むため. 19

  20. 3. 実装 - 高速化(C++) 改めて実装すると 右のようになる. これで通る. 20

  21. 4. まとめ ・今回のように, なんとなく再帰らしいことは分かるが,  その実装が上手く行かない時は, 実際に図に書き出すと  意外とうまく行くこともある. ・今回の高速化で用いたような,  減算を除算(加算を乗算)でするテクは便利なので,  使えるようになっておくと良いと思う.

    21
  22. 以上. お疲れ様でした.