题目链接:
https://acm.hdu.edu.cn/showproblem.php?pid=7049
题目大意:
一个人向任意方向抛出一个炸弹,炸弹的速度为v,t秒后爆炸,爆炸范围为R,炸弹爆炸就会炸死这个人,问炸不死的期望值(对1e9 + 7)取模
解题思路:
先看图,S是抛点(人在的点),T是落地点(炸点),蓝色的是炸弹的运动轨迹。根据运动学的知识我们可以看出如下的关系。
我们假设落地点固定,那么S点就在以O为圆心,vt为半径的圆上运动。
Q1:为什么落地点固定?
如果落地点固定,可以根据余弦定理推断出角度,这样抛点就是在圆上运动。倘若抛点固定,无法计算边之间的关系。
为了方便计算,我们令
因为这是一个3D的,所以其实O是半径为r的球的球心,S在球上
SO与竖直方向所成的角就是 ,在空间里就是如下图
可以用余弦公式得到
上述得到的P是炸死的概率,我们所求的答案是存活的概率,因此 ans = 1- P
因此整理可得
除此之外,我们还要考虑在什么情况下一定被炸死, 什么情况下一定存活.观察图可知
如果 (r + h) <= R 一定被炸到
如果|r - h| >= R 一定存活
(上述结论不细讲,画图可得)
代码实现
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
ll Qpow (ll a, ll b) {
ll ans = 1;
while (b) {
if (b & 1) ans = ans * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return ans;
}
void work(){
ll t,v,R;
scanf("%lld%lld%lld",&t,&v,&R);
ll r = v * t;
ll h = 5 * t * t;
if (r + h <= R) {
puts("0");
} else if (abs(h - r) >= R) {
puts("1");
} else {
printf("%lld\n", ((r + h) * (r + h) - R * R) * Qpow(4 * r * h, MOD - 2) % MOD);
}
}
int main() {
int T;
scanf("%d",&T);
while (T--) {
work();
}
return 0;
}