SlideShare ist ein Scribd-Unternehmen logo
1 von 16
解説:エンブレム
技術室奥プログラミングコンテスト#2 問題D
問題概要
H×Wの長方形がある
左下の角から線を引き始める
端にぶつかると反射する
角にぶつかると止まる
線の交点の数は?
考察
実はHが答えに関係しないのでは???
→関係しない(上下に引き延ばされるだけ)
考察
じゃあWとKは?
→その“比”が答えに関係する
(比を保ったまま値を変えても左右にのびるだけ)
考察
WとKの比が重要らしい
そこでとりあえず、W,Kをgcd(W,K)で割って、互い
に素にしておく(以下W,Kは常に互いに素)。
考察
Hが何でもよいのだから、K×Wの長方形で問題を考
えなおしてみる。
線の交点がすべて格子点に乗りそう(後で証明)。
つまり、線の交点が乗るような格子点の数を数えれ
ばいいことになる。
考察
ではそれらはどんな格子点か?
実は、格子点を座標(x,y)とおいたときに、
x+y=0(mod 2)となることと、線の交点が乗ることは
同値。
以下でそれを示す
x+y=0(mod 2)⇐線の交点が乗る
線分を引く操作において、ある格子点(x1,y1)を通り、
次に格子点(x2,y2)通ったとすると、
x1+y1=x2+y2(mod 2)が成り立つ。
これは、次の格子点に移る際には、x,yがそれぞれ、1増
えるまたは1減ることより明らか。
最初に座標(0,0)にいるので、x+y=0(mod 2)が常に成立
x+y=0(mod 2)⇒線の交点が乗る
まず、いかなる格子点(x,y)についても、(x-1,y-1),(x-
1,y+1),(x+1,y-1),(x+1,y+1) のどこに向かって線を引
き始めても、いづれどこかの角にぶつかる。
なぜなら、WとKが互いに素であるから、中国式剰余
定理より、x+a=0(mod W),y+b=0(mod H)が成り立つ
aがかならず存在するから。
x+y=0(mod 2)⇒線の交点が乗る
また、W,Kが互いに素であることから、長方形の4
つの角は、x+y(mod 2)が0のもの2つと1のもの2つに
分けられる。
さらに、ある角から出発し、その角に戻ってくるこ
とがないことも自明(どこかで180度回転する必要
があるから)
x+y=0(mod 2)⇒線の交点が乗る
よって、 x+y=0(mod 2)を満たす格子点すべてを、引
いた線分は2回通ることが示された。
交点が格子点に乗る証明
今言ったように、座標(0,0)から引き始めたやつは、
x+y=0(mod 2)の点しか通らない
よって、下の図のような状態はない
アルゴリズム
先の議論より、長方形の内部にある、x+y=0(mod 2)
の格子点の数が求まればよいとわかった。
これを、xを2で割った余りについて場合分けして解
く
x=1(mod 2)のとき
まず、このようなxは、⌊W/2⌋個存在する。( ⌊a⌋はガ
ウス記号)
それぞれのxについて、y=1(mod 2)となるようなも
のの個数を求めたいが、これは、 ⌊K/2⌋個である。
よって、 ⌊W/2⌋× ⌊K/2⌋個の格子点がある。
x=0(mod 2)のとき
先と同様に考えると、⌊(W-1)/2⌋× ⌊(K-1)/2⌋個の格子
点がある。
アルゴリズム
二つの場合が求まったので、これを足して答えを得
る。
証明が雑でごめんなさい
おしまい

解説:エンブレム