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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
task4233
February 07, 2019
Programming
570
0
Share
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
350
embedパッケージを深掘りする / Deep Dive into embed Package in Go
task4233
2
660
GC24 Recap: Interface Internals
task4233
1
770
GopherCon 2024 Recap: Exploring the Go Compiler: Adding a "four" loop / 構文追加で学ぶGoコンパイラの処理
task4233
0
770
Goのデバッグ用ロガーの開発を通して得た デバッグとgoパッケージに関する知見/Knowledge by given implementation of logger for debug
task4233
0
610
入門XSS / Introduction of XSS
task4233
3
3k
脆弱性スキャナのOWASP ZAPを コードベースで扱ってみる / OWASP ZAP on a code base
task4233
2
3.4k
誘導を読み取って1ステップ上の問題を解けるようになろう/Tips for Solving CTF with Reading Leads
task4233
1
980
JavaScriptはなぜシングルスレッドでも非同期処理ができるのか/Why Can JavaSctipt Invoke Asynchronous in Single Thread?
task4233
24
22k
Other Decks in Programming
See All in Programming
[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見
ikezoemakoto
0
340
의존성 주입과 모듈화
fornewid
0
120
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
2.3k
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
2
260
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
230
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
210
SkillがSkillを生む:QA観点出しを自動化した
sontixyou
6
3.2k
How Swift's Type System Guides AI Agents
koher
0
190
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
200
Go_College_最終発表資料__外部公開用_.pdf
xe_pc23
0
140
生成 AI 時代のスナップショットテストってやつを見せてあげますよ(α版)
ojun9
0
340
Coding as Prompting Since 2025
ragingwind
0
770
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Bash Introduction
62gerente
615
210k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Evolving SEO for Evolving Search Engines
ryanjones
0
180
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
330
Believing is Seeing
oripsolob
1
110
Typedesign – Prime Four
hannesfritz
42
3k
Six Lessons from altMBA
skipperchong
29
4.2k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
130
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
220
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
以上. お疲れ様でした.