問題はこちら
No.643 Two Operations No.2 - yukicoder
いろんな解説が出来て楽しいのでいろいろ紹介
○偏角を見る
座標平面(X,Y)の点との対応を考える。偏角をθとする。
操作によりθ=45°とすることが目的である。
操作1は直線Y=Xでの対称移動であり、操作2は直線Y=(tan22.5°)Xでの対称移動となる。
よって操作1によりθは90°-θに移り、操作2によって45°-θに移る。
これらの操作ではmod 45°でθまたは-θにしか移らないことから、θ=0 mod 45°であることが必要。
そのような(X,Y)の組は(X,0),(X,X),(0,X),(X,-X)の4種しかないので、具体的に確かめることができる。
○線形変換のなす部分群を考える
とおく。
操作1はAに、操作2はBに対応する線形変換である。
A,Bが生成するの部分群を定数倍で割ったもの、を考える。
(以下、行列は定数倍で割った同値類で考えるものとする)
が成り立つことがわかるので、
となることがわかる。よってこれらを具体的に計算することで求めることができる。
○射影空間へうつす
X=Y=0なら明らか。そうでないとする。
操作1をf、操作2をgと書く。またα(X,Y)=X/Yとおく。
1/0=∞、1/∞=0など適当な演算を定める。ただし∞は正負を区別しない(要するにαはR^2\{0}からP^1への自然な写像)
関数の合成について
αf=1/α、αgg=α、αgf=-αg
となることが計算により確かめられるので、f,gの操作を行って得られるものは
±α、±1/α、±αg、±1/αgのみであることがわかる。
よってこれらのいずれかが1となるためにはα(X,Y)=±1またはα(X+Y,X-Y)=±1が必要。
これらについては具体的に考えることができる。
main(){ scanf("%d%d",&x,&y); if(x==y)puts("0"); else if(y==0)puts("1"); else if(x==0)puts("2"); else if(x==-y)puts("3"); else puts("-1"); }
はい
main(x,y){ scanf("%d%d",&x,&y); printf("%d",x-y?y?x?x+y?-1:3:2:1:0); }
67B