CF239に参加。
A,Bを解いたものの両方ミス、まさかの0点…と思ったらAで15Hackを決めそれだけで2ケタ順位に入るというグダグダっぷり。
http://codeforces.com/contest/407/problem/A
問題
2つの整数a,bが与えられる。
以下の条件を満たす2次元座標中の格子点3つがあれば答えよ。
- 3点は直角三角形を成し、直角を挟む2辺の長さはa,bである。
- 各辺はX軸およびY軸に平行でない。
解法
1つの点を原点に置くとする。
そこからの長さがa,bとなるような座標(ax,ay),(bx,by)(それぞれ正の整数)を総当たりで求める。
両者のX軸と成す角が同じであったら、片方90度回転させればよい。
その際、X座標同士やY座標同士が一致しないよう気を付ける必要がある。
おかげで、a=15,b=20の時(12,9)(12,-16)といった回答が多数あり、15hack取ることができた。
int A,B; void solve() { int f,i,j,k,l,x,y; cin>>A>>B; int ax,bx; for(ax=1;ax<A;ax++) { int ay=sqrt(A*A-ax*ax+0.5); if(ax*ax+ay*ay!=A*A) continue; for(bx=1;bx<B;bx++) { int by=sqrt(B*B-bx*bx+0.5); if(bx*bx+by*by!=B*B) continue; if(ax*by==ay*bx) { _P("YES\n"); _P("0 0\n"); _P("%d %d\n",ax,ay); if(ay==bx) _P("%d %d\n",by,-bx); else _P("%d %d\n",-by,bx); return; } } } _P("NO\n"); }
まとめ
自分が解けなかったのにHackだけこんなにとれるとは。