Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AtCoder AGC 001 B - Mysterious Light 考察と実装
Search
task4233
February 07, 2019
Programming
580
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AtCoder AGC 001 B - Mysterious Light 考察と実装
AGC001-B Mysterious LightのEditorialの理解の足しになるように, という思いで作成しました.
task4233
February 07, 2019
More Decks by task4233
See All by task4233
pprof vs runtime/trace (FlightRecorder)
task4233
0
420
embedパッケージを深掘りする / Deep Dive into embed Package in Go
task4233
2
750
GC24 Recap: Interface Internals
task4233
1
820
GopherCon 2024 Recap: Exploring the Go Compiler: Adding a "four" loop / 構文追加で学ぶGoコンパイラの処理
task4233
0
810
Goのデバッグ用ロガーの開発を通して得た デバッグとgoパッケージに関する知見/Knowledge by given implementation of logger for debug
task4233
0
660
入門XSS / Introduction of XSS
task4233
3
3k
脆弱性スキャナのOWASP ZAPを コードベースで扱ってみる / OWASP ZAP on a code base
task4233
2
3.7k
誘導を読み取って1ステップ上の問題を解けるようになろう/Tips for Solving CTF with Reading Leads
task4233
1
1k
JavaScriptはなぜシングルスレッドでも非同期処理ができるのか/Why Can JavaSctipt Invoke Asynchronous in Single Thread?
task4233
24
22k
Other Decks in Programming
See All in Programming
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
370
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
160
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1k
「人を評価する AI」の設計と実装
ryoyanara
0
240
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
200
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
270
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
170
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
130
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
160
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
250
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
120
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Skip the Path - Find Your Career Trail
mkilby
1
190
Practical Orchestrator
shlominoach
191
12k
Amusing Abliteration
ianozsvald
1
260
Six Lessons from altMBA
skipperchong
29
4.5k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
490
The SEO Collaboration Effect
kristinabergwall1
1
530
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Crafting Experiences
bethany
1
260
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Transcript
AGC001-B 考察と実装 @task4233
もくじ 1. 概要 2. 考察 3. 実装 4. まとめ 2
1. 概要 ・1辺の長さがNの正三角形abcがある. ・不思議な光は, 自分の軌跡と辺に当たったときに反射する. ・頂点aからXだけ離れた点から辺bcと平行な光を放った時, もう一度その点に戻ってくるまでの軌跡の和を求めよ. 3
2. 考察 問題がよくわからないので, 問題に与えられた図を用いて一般化してみる. 4
N, Xについて一般化(図はN=5, X=2の時のもの) X N X 5
N, Xについて一般化(図はN=5, X=2の時のもの) X N N-X X 6
N, Xについて一般化(図はN=5, X=2の時のもの) X N N-X X X 7
N, Xについて一般化(図はN=5, X=2の時のもの) X X N-X X 8
N, Xについて一般化(図はN=5, X=2の時のもの) (N-X)-X N-X X 9
N, Xについて一般化(図はN=5, X=2の時のもの) (N-X)-X N-X X (N-X)-X 10
N, Xについて一般化(図はN=5, X=2の時のもの) (N-X)-X (N-X)-X (N-X)-X 11
N, Xについて一般化 先ほどまでの図で反射した光に周期性があったことが分かるは ず. その周期性とは以下の3つ. 1. 2回反射した後の領域に, 平行四辺形が出現すること 2. N,
N-Xの後の反射において, 2回ずつ同じ距離を進むこと 3. 出来た平行四辺形の辺が等しい時に, 反射が終わること それぞれ見ていく. 12
2-1. 平行四辺形の出現 右下の図は6枚目のスライドの図である. ここで, 光が2回進むと平行四辺形ができることが分かる. なお, その辺の長さは 前の2つの光の軌跡の距離と一致する. (右の図で言えば, XとN-Xになる)
X N N-X X 13
2-2. 同じ距離の軌跡 右下の図は8枚目のスライドの図である ここで, X->N-Xの軌跡の後に, X->Xのように同じ距離だけ進んでいることが分かるはず. なお, その距離は2-1.で説明した 平行四辺形の辺の最小値である. X
X N-X X 14
2.3. 反射の終了 右下の図は11枚目のスライドの図である ここで, 反射が終了する時, 平行四辺形の2辺が等しく なっていることが分かるはず. ((N-X)-X = (N-X)-Xで等しい)
(N-X)-X (N-X)-X (N-X)-X 15
3. 実装 2.での考察により, 以下のような再帰が書ける. 出来る平行四辺形の2辺をx, y(x < y)とすると, と書ける. 16
3. 実装(C++) 実装すると右のようになる. ※int64_tはlong longでも問題ない しかし, これは制約が なのでTLEになる. そこで, 再帰を簡潔にする.
17
3. 実装 - 高速化(1) 再帰関数をじーっと見ていると, return f(mn, mx-mn) + 2
* mn の部分が無駄に見えてくる. (なぜなら, mx-mnというパラメータの関数を呼び出す度に2*mnを 加算するので, その加算をまとめて[mx/mn]* 2 *mnとすればまと められるから) ※[ ]はガウス記号. 18
3. 実装 - 高速化(2) すると, 先ほどの再帰は以下のように書き直せるはず. なお, y%x=0の式で最後にxを引いているのは, 再帰の終了時に光が平行四辺形の半分だけ進むため. 19
3. 実装 - 高速化(C++) 改めて実装すると 右のようになる. これで通る. 20
4. まとめ ・今回のように, なんとなく再帰らしいことは分かるが, その実装が上手く行かない時は, 実際に図に書き出すと 意外とうまく行くこともある. ・今回の高速化で用いたような, 減算を除算(加算を乗算)でするテクは便利なので, 使えるようになっておくと良いと思う.
21
以上. お疲れ様でした.