1053:Accelerated Railgun

点p(px,py)から速度ベクトルvで打ち出されたレールガンが
原点にたどり着く距離を出力する問題。

原点にたどり着くには、一度も反射せずたどり着くか
反射してたどり着くしかない。
後者の場合は反射角が90度になっていなければならない。

cosθ= p・v / |p||v|

でcosを求め、

一度も反射しない場合 cosθ= -1
反射する場合 cosθ= 1

#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<climits>
#include<cstdio>
#include<cfloat>
 
using namespace std;
 
double EPS = 1e-10;
 
struct point{
  double x, y;
};
 
double dot(point a, point b) {
  return (a.x * b.x + a.y * b.y);
}
 
double norm(point a){
  return sqrt(a.x*a.x+a.y*a.y);
}
 
int main(void){
  double D;
  point p,v;
  
  while(cin >> D,D){
   
    cin >> p.x >> p.y >> v.x >> v.y;
      
    double d=D+1;
    double cos=dot(p,v)/norm(p)/norm(v);
 
    if(abs(1.0 + cos) < EPS )d=norm(p);
    else if(abs(1.0 - cos) < EPS)d=2.0-norm(p);
 
    if(d<D || abs(d-D)<EPS)printf("%.8f\n",d);
    else cout << "impossible" << endl;
  }
  
  return 0;
}