Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
以上. お疲れ様でした.