F - Origami Warp Editorial
by
Rice_tawara459
到達可能でないことを到達不可能であると呼ぶことにします。また、 \(2\) 点 \(X,Y\) に対し \(XY\) で \(X,Y\) 間の距離を表すものとします。
前提として、「到達可能である」という関係は同値関係になります。すなわち、
- 反射律 ( \(P\) から \(P\) へは到達可能 )
- 対称律 ( \(P\) から \(Q\) に到達可能 \(\Leftrightarrow\) \(Q\) から \(P\) に到達可能 )
- 推移律 (\(P\) から \(Q\) に到達可能かつ \(Q\) から \(R\) に到達可能 \(\Rightarrow\) \(P\) から \(R\) に到達可能)
を満たすということです。
証明
反射律は自明なので、対称律と推移律を証明します。
以下の事実を確認しておきます。
- 直線の列 \((L_1, L_2, \ldots, L_n)\) を考える。 Alice が \(X\) にいるときに、 \(L_1, \ldots, L_n\) を順に使ったときの移動先を \(X'\) とする。同様に、 Alice が \(Y\) にいるときに、 \(L_1, \ldots, L_n\) を順に使ったときの移動先を \(Y'\) とする。このとき、\(XY=X'Y'\) が成り立つ。
これは操作回数に関する数学的帰納法などで証明できます。この事実を用いて証明していきます。
まずは対称律を示します。 \(P\) から \(Q\) へ到達可能であるとします。任意の実数 \(\varepsilon > 0\) をとります。このとき、 \(P\) から \(Q\) への到達可能性から、ある直線の列 \((L_1, \ldots, L_n)\) が存在して、 Alice が \(P\) にいるときに \(L_1, \ldots, L_n\) を順に使った際の移動先を \(P'\)としたとき、 \(P'Q<\varepsilon\) となります。ここで、 Alice が \(P'\) にいるときに \(L_n, L_{n-1}, \ldots, L_1\) を順に使ったときの移動先が \(P\) であることと、 \(P'Q<\varepsilon\) であることから、 Alice が \(Q\) にいるときに \(L_n, L_{n-1}, \ldots, L_1\) を順に使ったときの移動先を \(Q'\) とすると、 \(P'Q=PQ'<\varepsilon\) となります。これにて、 \(Q\) から \(P\) へ到達可能であることが示されました。
続いて、推移律を示します。 \(P\) から \(Q\) 、 \(Q\) から \(R\) へそれぞれ到達可能であるとします。任意の実数 \(\varepsilon > 0\) をとります。 \(P\) から \(Q\) への到達可能性から、ある直線の列 \((L_1, \ldots, L_n)\) が存在して、 Alice が \(P\) にいるときに \(L_1, \ldots, L_n\) を順に使った際の移動先を \(P'\)としたとき、 \(P'Q<\frac{\varepsilon}{2}\) となります。 \(Q\) から \(R\) への到達可能性から、ある直線の列 \((K_1, \ldots, K_m)\) が存在して、 Alice が \(Q\) にいるときに \(K_1, \ldots, K_m\) を順に使った際の移動先を \(Q'\)としたとき、 \(Q'R<\frac{\varepsilon}{2}\) となります。ここで、 \(P'Q<\frac{\varepsilon}{2}\) であったので、 Alice が \(P'\) にいるときに \(K_1, \ldots, K_m\) を順に使った際の移動先を \(P''\)としたとき、 \(P''R \le P''Q'+Q'R = P'Q + Q'R<\frac{\varepsilon}{2}+\frac{\varepsilon}{2}=\varepsilon\) となります。 \(P''\) というのは、 Alice が \(P\) にいるときに \(L_1, \ldots, L_n, K_1, \ldots, K_m\) を順に使った際の移動先に等しいです。したがって、 \(P\) から \(R\) へ到達可能であることが示されました。
\(2\) 本の直線 \(L_1,L_2\) が交わってできる交点 \(O\) であって、 \(L_1\) と \(L_2\) のなす角が \(\frac{\pi}{4}\) の倍数でないようなものを よい交点 と呼ぶことにします。また、この \(O\) に対し、 \(L_1,L_2\)のことを、 \(O\) を構成する直線と呼ぶことにします。まずはこのよい交点の性質を観察しましょう。
よい交点の性質
よい交点 \(O\) が存在するとします。このとき、 \(2\) 点 \(S,T\) が \(O\) を中心とする同一円周上にあるとき、またそのときに限り、 \(S\) から \(T\) へは \(O\) を構成する \(2\) 本の直線により到達可能となります。
証明
\(O\) を原点として考えてよいです。
\(1\) 本目の直線の偏角を \(\alpha\) 、 \(2\) 本目の直線の偏角を \(\beta\) とします。また、現在の Alice の位置を \(X\) で表すこととします。
まず、 \(2\) 本の直線をどのように使っても、 \(OX\) の値は変わりません。したがって、\(OS \ne OT\) の場合、すなわち \(S,T\) が \(O\) を中心とする同一円周上にない場合、 \(S\) から \(T\) へは到達不可能です。
以降、 \(O\) を中心とし、 \(S\) を通る円周上の移動について考えます。 \(X\) の偏角を \(x\) とし、移動による \(x\) の変化について考えます。 \(1\) 本目の直線での移動により \(x \mapsto 2\alpha -x\) 、 \(2\) 本目の直線での移動により \(x \mapsto 2\beta -x\) と変化します。したがって、 \(1\) 本目、 \(2\) 本目と順に使うことで、 \(x \mapsto x+2(\beta-\alpha)\) という変化が可能になります。同様に、\(2\) 本目、 \(1\) 本目と順に使うことで、 \(x \mapsto x-2(\beta-\alpha)\) という変化も可能になります。これを繰り返すことで、任意の整数 \(n\) について、偏角が \(x+2n (\beta-\alpha) (\bmod 2\pi)\) となる点に有限回で移動することができます。 \(\frac{\beta-\alpha}{\pi} \) が有理数でないとき、これらの有限回で移動可能な点たちは円周上を稠密に「埋め尽くす」ことができます。 (これはディオファントス近似などを使うことで証明できます。参考:Wikipedia )
\(\frac{\beta-\alpha}{\pi} \) が有理数にならないことを背理法で示します。 \(\frac{\beta-\alpha}{\pi} \) が有理数であると仮定します。この問題では、直線は \(2\) つの格子点を通る直線として与えられます。また、 \(O\) はよい交点であるので、\(\beta-\alpha=\pm\frac{\pi}{2}\) となることはありません。したがって \(\tan (\beta-\alpha)\) は有理数になります。 \(\tan (\beta-\alpha)\) が有理数であるときに、 \(\frac{\beta-\alpha}{\pi} \) が有理数となるのは、 \(\beta-\alpha=0, \pm\frac{\pi}{4}, \pm\frac{3\pi}{4}\) となるときに限られます(Niven の定理の系。参考:Wikipedia )。 しかし、これらはいずれも \(\frac{\pi}{4}\) の倍数であり、 \(O\) がよい交点であることに反します。したがって、 いい交点においては、 \(\frac{\beta-\alpha}{\pi} \) は有理数とはなりません。
以上より、 \(2\) 点\(S,T\) が \(O\) を中心とする同一円周上に存在するとき、 \(S\) から \(T\) は到達可能となります。
以上の事実と、到達可能性の推移律により、「直線について線対称な位置に移動する」という操作のほかに、「よい交点を中心とする同一円周上を連続的に移動する」という操作をできるようにしても、到達可能かどうかの結果は変わらないことが分かります。
よい交点が \(2\) つ以上存在する場合
偏角が \(\frac{\pi}{4}\) の倍数でないような直線が少なくとも \(1\) つ存在し、また原点を通らないような直線が少なくとも \(1\) つ存在するとき、よい交点が \(2\) 個以上存在します。このとき、任意の \(2\) 点について到達可能となります。
証明
よい交点 \(2\) つを \(O_1,O_2\) とします。
まず、任意の点 \(T\) が \(O_1\) から到達可能であることを示します。 \(d=O_1O_2\) とします。また、現在の Alice の位置を \(X\) と表すことにします。
はじめ、 \(O_1X=0\) です。ここから、 \(O_2\) を中心として円周上の移動を行うことで、 \(O_1X=2d\) とできます。ここから、 \(O_1\) を中心として円周上の移動を行い、 \(X\) を \(O_1\) に関して \(O_2\) と反対側の位置に移動させます。ここからさらに \(O_2\) を中心として移動を行うことで、\(O_1X=4d\) とできます。 これを繰り返すことで、 \(O_1X\) をいくらでも大きくすることができます。ここまでの距離の変化は連続的に行うことができるため、 \(O_1X\) の値は任意に設定できます。このことを用いて、 \(O_1X=O_1T\) とした後、 \(O_1\) を中心として円周上の移動を行うことで、 \(T\) に移動することができます。よって、 \(O_1\) から \(T\) は到達可能です。
任意の \(2\) 点 \(S,T\) に関して、 \(O_1\) から \(S\) 、 \(O_1\) から \(T\) に到達可能であるので、 \(S\) から \(T\) も到達可能です。
よい交点がちょうど \(1\) つ存在する場合
偏角が \(\frac{\pi}{4}\) の倍数でないような直線が少なくとも \(1\) つ存在し、かつ全ての直線が原点を通る場合、よい交点が原点にちょうど \(1\) つ存在し、原点以外に交点は存在しません。この場合、原点を中心とする同一円周上の移動のみ可能であり、逆にそれ以外の移動は不可能です。したがって、与えられた \(2\) 点の原点からの距離が等しいかどうかを判定すればよいです。
よい交点が存在しない場合
全ての直線の偏角が \(\frac{\pi}{4}\) の倍数となるとき、よい交点は \(1\) つも存在しません。この場合、移動前の点が格子点の場合、有限回の移動において移動先は常に格子点となります。ここで、 \(P,Q\) を格子点として、 \(P\) から \(Q\) へ到達可能であるとします。このとき、 \(P'Q<\frac{1}{2}\) となるような点 \(P'\) が存在し、 \(P\) から \(P'\) へ有限回で移動可能となりますが、 \(P\) から有限回で移動できる場所は格子点に限られるため、 \(P'\) として考えられるものは \(Q\) そのものに限られます。すなわち、 「\(P\) から \(Q\) へ到達可能 \(\Rightarrow\) \(P\) から \(Q\) へは有限回で移動可能」が成り立ちます。逆は明らかに成り立つので、よい交点が存在しない場合においては、有限回で移動可能かどうかのみを考えればよいです。
ここで、以下の問題の解法を確認しておきましょう。
Alice が数直線上にいる。数直線上の点 \(X_1,X_2, \cdots ,X_N\) が与えられる。Alice は、これらの点の中から一つ選び、その点について現在位置と対称な位置に移動するという操作を、好きな回数行うことができる。与えられた \(2\) 点 \(P,Q\) について、 \(P\) から \(Q\) に移動可能か判定せよ。
すなわち、今回の問題の \(1\) 次元バージョンです。これは有名問題で、次のように解くことができます。
\(N=0,1\) の場合は自明なので、 \(N \ge 2\) の場合を考える。任意の \(2\) 点間の距離の \(\gcd\) をとる(実際には \(X_2-X_1,X_3-X_2, \cdots ,X_N-X_{N-1}\) の \(\gcd\) を取れば十分)。この値を \(g\) とする。 \(P\) を勝手な点で \(1\) 回移動させた先の点を \(P'\) とすると、 \(\bmod 2g\) で\(P\) と \(Q\) の座標が等しいか、 \(P'\) と \(Q\) の座標が等しければ、 \(P\) から \(Q\) へは移動可能である。
この解法を見ると、\(X_1\) と \(g\) さえ決まれば、移動できる場所は変わらないことが分かります。したがって、 \(X_1,X_1+g\) の \(2\) 点が与えられていたとしても結果は変わりません。また、 \(X_1+ng (n \in \mathbb{Z})\) が与えられていたとしても結果は変わりません。
この解法を踏まえた上で、元の問題に戻ります。
直線の偏角が \(\frac{n\pi}{4} \ (n=0,1,2,3)\) であるとき、 \(n\) をその直線の 向き と呼ぶことにします。
向きが \(1,3\) の直線が存在しない場合
この場合、縦と横についての操作が独立になります。したがって、 \(1\) 次元の場合の問題を、各次元について独立に解くことで判定が可能となります。
向きが \(1,3\) の直線が存在した場合
任意の直線が原点を通る場合は簡単に判定できます。そうでない場合を考えます。
以下の事実を確認しておきます。
向きが \(0,1\) の \(2\) 直線が交わる点 \(O\) について、 \(O\) を通るような向き \(2\) の直線を追加 (もしくは削除) しても、移動可能な点は変わらない。他の向きにおいても同様の事実が成り立つ。
簡単な証明
向き $1,0,1$ の直線を順に使うことで、向き $2$ の直線による移動を代替できます。したがって、向き $2$ の直線を追加 (削除) しても、移動可能な場所は増えません (減りません) 。この事実により、 例えば向き \(1,2\) の直線が交わっていたとき、その交点に向き \(0\) の直線を追加し、向き \(2\) の直線を削除する、という一連の動作を (到達可能性を変えずに) 行うことができます。結果的に、向き \(2\) の直線を向き \(0\) に変換したような形になっています。この例のような直線の変換、また追加や削除を多用することで、到達可能性を変えないまま、到達可能性を判定しやすい状況を作っていきます。
まず、\(y\) 軸を除いた向き \(2\) の直線をすべて消し、向き \(0\) の直線に変換しておきます (向き \(1\) or \(3\) の直線が少なくとも \(1\) 本は存在するため、このようなことが可能です) 。次いで、向き \(3\) の直線も、向き \(1\) の直線に変換しておきます。この時点で、 \(1\) 次元の解法から、向き \(1\) の直線は高々 \(2\) 本のみ存在するとしてよいです。
向き \(1\) の直線と \(y\) 軸との交点に、向き \(0\) の直線を追加します。向き \(0\) の任意の直線 \(2\) 本の間隔の \(\gcd\) を取り、その値を \(g\) とします (直線 \(y=0\) が存在するため、実質的には直線の \(y\) 切片たちの \(\gcd\) となります)。 \(1\) 次元の解法を考えると、直線 \(y=ng (n \in \mathbb{Z})\) を追加しても移動できる場所は変わりません。 さらに、直線 \(x=ng (n \in \mathbb{Z})\) を追加しても移動できる場所は変わりません (向き \(1\) の直線と向き \(0\) の直線の交点に向き \(2\) の直線を追加しました) 。ここで、向き \(1\) の直線が \(2\) 本ある場合、片方を向き \(3\) に変えておきます。
これにて、到達可能性を変えないまま、直線の配置を変更することができました。現在平面上に存在する辺は、直線 \(y=ng, x=ng (n \in \mathbb{Z})\) と、向き \(1,3\) の直線が高々 \(1\) 本ずつとなります。この状況で到達可能性を判定します。
まず判定方法を述べます。操作の最初に、傾き \(1\) の直線、傾き \(3\) の直線を使うかどうかをそれぞれ決めます。これら \(2 \times 2=4\) 通りについて、最初の移動を行ったのち、向き \(0,2\) の直線のみを用いて移動可能かを判定すればよいです。証明は以下の通りです。
証明
上記の方法で移動可能と判定された場合、明らかに移動可能です。逆を示します。
\(S\) から \(T\) へ移動するための操作の列があるとします。この中で、向き \(0\) の直線による操作、向き \(1\) の直線による操作を順に行う箇所があるとします (このようなものを \(0,1\) の操作と呼ぶことにします)。この操作において、 \(2\) 本の直線の交点を \(O\) とすると、 \(O\) を通る向き \(2\) の直線が存在します。この直線を用いると、 \(0,1\) の操作を \(1,2\) の操作に変換することができます。同様に、 \(2,1\) は \(1,0\)、 \(0,3\) は \(3,2\)、 \(2,3\) は \(3,0\) というような変換を行うことができます。この操作を繰り返すことで、 向きが \(1,3\) の直線による操作をすべて操作列の最初に持ってくることができます。向き \(1\) の直線の操作と、向き \(3\) の直線の操作は独立であり、それぞれの向きに直線は高々 \(1\) 本しか存在しないため、 \(2\) 回以上の操作をする必要はありません。したがって、向き \(1,3\) の直線で高々 \(1\) 回操作をし、残りは向き \(0,2\) の直線で操作をするという操作列が存在することが示せました。これにより、 \(S\) から \(T\) へ移動可能な場合、上記の方法で移動可能と判定されます。
以上により、この場合も判定することができました。本解説では証明を楽にするために直線を大量に用意しましたが、実際の実装では \(g\) の値だけ持っておけば十分です。また、傾き \(1\) の直線を傾き \(3\) に変換する必要もなく、傾き \(1\) の直線 \(2\) 本について最初に使うかどうかで \(4\) 通りを試せばよいです。
posted:
last update:
