Official

B - Get Closer Editorial by physics0523


解法1. 2点間の距離を利用して解く

\((0,0)\) と点 \((A,B)\) の距離を \(d\) とすると、 \(\left( \frac{A}{d}, \frac{B}{d} \right)\) が答えです。
ここで、 \(d=\sqrt{A^2+B^2}\) です。

実装例(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int x,y;
  cin >> x >> y;
  int d2=x*x+y*y;
  double d=d2;
  d=sqrt(d);
  double dx=x,dy=y;
  cout << dx/d << ' ' << dy/d << '\n';
  return 0;
}

解法2. 偏角を求めて解く

「点 \((0,0)\) と点 \((1,0)\) を結ぶ線分」と「点 \((0,0)\) と点 \((A,B)\) を結ぶ線分」がなす角を \(\theta\) とすると、答えは \((\cos \theta, \sin \theta)\) となります。
この問題は、 atan2 を利用して解くことができます。

実装例(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int x,y;
  cin >> x >> y;
  double theta=atan2((double)y,(double)x);
  cout << cos(theta) << ' ' << sin(theta) << '\n';
  return 0;
}

注記

小数を出力する際、出力形式に注意しましょう。以下のサンプルコードでは、次のように出力されます。

  • \(1\) 行目: 特に形式を指定せず出力する。出力すべき桁数が不足する可能性がある。
  • \(2\) 行目: 有効数字 \(12\) 桁出力する。
  • \(3\) 行目: 小数点以下を固定で \(12\) 桁出力する。

サンプルコード(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  double x=123.456789012345678;
  cout << x << '\n';                          // 123.457
  cout << std::setprecision(12) << x << '\n'; // 123.456789012
  printf("%.12lf\n",x);                       // 123.456789012346
}

posted:
last update: