【2021杭电多校第七场】1006Link with Grenade

该博客探讨了一个涉及物理学、运动学和概率论的编程挑战。问题中,一个人投掷炸弹,需要计算在给定速度、时间和爆炸范围条件下生存的概率。通过几何和三角恒等式,可以确定炸弹轨迹和生存概率的数学模型。代码实现中,运用了余弦定理和快速幂运算来计算期望的生存时间。此外,还分析了确定死亡和生存的边界条件。
摘要由CSDN通过智能技术生成

题目链接:

https://acm.hdu.edu.cn/showproblem.php?pid=7049

题目大意:

一个人向任意方向抛出一个炸弹,炸弹的速度为v,t秒后爆炸,爆炸范围为R,炸弹爆炸就会炸死这个人,问炸不死的期望值(对1e9 + 7)取模

解题思路:

先看图,S是抛点(人在的点),T是落地点(炸点),蓝色的是炸弹的运动轨迹。根据运动学的知识我们可以看出如下的关系。

我们假设落地点固定,那么S点就在以O为圆心,vt为半径的圆上运动。

Q1:为什么落地点固定?

如果落地点固定,可以根据余弦定理推断出角度,这样抛点就是在圆上运动。倘若抛点固定,无法计算边之间的关系。

为了方便计算,我们令r=vt,h=\frac{1}{2}g*t^{2}; 

因为这是一个3D的,所以其实O是半径为r的球的球心,S在球上

SO与竖直方向所成的角就是\theta ,在空间里就是如下图 

cos\theta 可以用余弦公式得到 

上述得到的P是炸死的概率,我们所求的答案是存活的概率,因此 ans = 1- P

因此整理可得

ans = \frac{(r+h)^{2} - R^{2}}{4*r*h}

除此之外,我们还要考虑在什么情况下一定被炸死, 什么情况下一定存活.观察图可知

如果 (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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值