PKU 2641-Billiard

問題概要

a×bの大きさのビリヤード盤がある.
ビリヤード盤の中央から半径0のボールを打った所,横にx回,縦にy回反射してs秒後に最初の位置に戻った.
発射時の角度(水平方向から)と速度を求めよ.

解法

反射せずにそのまま進むと仮定すると,(a*x,b*y)先に進む.

実装(C++)

#include <algorithm>
#include <vector>
#include <cstdio>
#include <cmath>
using namespace std;

typedef long long int lli;

#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define rep(i,s,x) for(int i=s;i<(int)(x);i++)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RREP(i,x) for(int i=(x);i>=0;i--)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
const double PI=3.14159265358979323;
inline double rad2deg(double rad){
	return rad/PI*180;
}
int main(){
	int a,b,s,x,y;
	for(;scanf("%d%d%d%d%d",&a,&b,&s,&x,&y),a|b|s|x|y;){
		printf("%.2f %.2f\n",rad2deg(atan2(b*y,a*x)),hypot(a*x,b*y)/s);
	}
}