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: