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); } }