problem
一个质点在一个奇妙的星球上(重力加速度为 g g g)做斜抛运动,初速度为 v v v,与地面夹角为 θ θ θ(角度制)。
质点每次落地后会反弹,反弹后速度大小会乘以一个常数 d ( 0 ≤ d < 1 ) d(0≤d< 1) d(0≤d<1),方向与初速度相同。请问质点最后的落点离起点多远?
注:质点飞行过程中不计空气阻力与摩擦力,所有数值单位均为国际标准单位制。
有 T T T 组数据。
数据范围: 0 ≤ v ≤ 1000 0≤v≤1000 0≤v≤1000, 0 < g ≤ 1000 0< g≤1000 0<g≤1000, 0 ≤ d < 1 0≤d< 1 0≤d<1, 0 < θ < 90 0<θ< 90 0<θ<90, T ≤ 50000 T≤50000 T≤50000。
solution
接下来是物理讲堂~
先假设 d = 0 d=0 d=0(就是不反弹)来推一下吧。
把角度制换成弧度制,得到 θ ′ = θ × π 180 θ'=θ\times\frac{\pi}{180} θ′=θ×180π。为了方便,以下的 θ θ θ 都是弧度制的。
然后把 v v v 分解,水平方向上是 v cos θ v\cos θ vcosθ,竖直方向上是 v sin θ v\sin θ vsinθ。那么竖直:
− g t 2 = 0 − v sin θ -g\frac t 2=0-v \sin θ −g2t=0−vsinθ
解出 t = 2 v sin θ g t=\frac{2v\sin θ}{g} t=g2vsinθ,那么水平位移就是:
x = 2 v sin θ v cos θ g = v 2 sin 2 θ g x=\frac{2v \sin θ v \cos θ}{g}=\frac{v^2 \sin 2θ}{g} x=g2vsinθvcosθ=gv2sin2θ
那么如果要反弹,答案就是:
a n s = ∑ i = 0 ∞ v 2 sin 2 θ g d 2 i = v 2 sin 2 θ g × 1 1 − d 2 \begin{aligned} ans&=\sum_{i=0}^{\infty}\frac{v^2 \sin 2θ}{g}d^{2i}\\ &=\frac{v^2 \sin 2θ}{g}\times \frac 1 {1-d^2} \end{aligned} ans=i=0∑∞gv2sin2θd2i=gv2sin2θ×1−d21
那么 O ( 1 ) O(1) O(1) 算就可以了。
code
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const double pi=acos(-1);
double angle,v,d,g;
int main(){
int T;
scanf("%d",&T);
double rad=pi/180.0;
while(T--){
scanf("%lf%lf%lf%lf",&angle,&v,&d,&g);
printf("%.5lf\n",v*v*sin(2.0*angle*rad)/g*1.0/(1.0-d*d));
}
return 0;
}