Slide 1

Slide 1 text

AGC001-B 考察と実装 @task4233

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

N, Xについて一般化 先ほどまでの図で反射した光に周期性があったことが分かるは ず. その周期性とは以下の3つ. 1. 2回反射した後の領域に, 平行四辺形が出現すること 2. N, N-Xの後の反射において, 2回ずつ同じ距離を進むこと 3. 出来た平行四辺形の辺が等しい時に, 反射が終わること それぞれ見ていく. 12

Slide 13

Slide 13 text

2-1. 平行四辺形の出現 右下の図は6枚目のスライドの図である. ここで, 光が2回進むと平行四辺形ができることが分かる. なお, その辺の長さは 前の2つの光の軌跡の距離と一致する. (右の図で言えば, XとN-Xになる) X N N-X X 13

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

3. 実装 - 高速化(1) 再帰関数をじーっと見ていると, return f(mn, mx-mn) + 2 * mn の部分が無駄に見えてくる. (なぜなら, mx-mnというパラメータの関数を呼び出す度に2*mnを 加算するので, その加算をまとめて[mx/mn]* 2 *mnとすればまと められるから) ※[ ]はガウス記号. 18

Slide 19

Slide 19 text

3. 実装 - 高速化(2) すると, 先ほどの再帰は以下のように書き直せるはず. なお, y%x=0の式で最後にxを引いているのは, 再帰の終了時に光が平行四辺形の半分だけ進むため. 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

以上. お疲れ様でした.