Link with Grenade 题解(物理题+球冠表面积公式)
题目链接
题目思路
看到题完全不会啊。。。
为啥群友的数学物理基础如此扎实
放下官方题解
随机从某球面上取点进行随机和使用角度进行两次积分实质上是一样的,因为这两种方法单位球面的面密度相
同。手雷在水平面上的方向并不会影响到其是否炸到人,因此我们只需要关心竖直面。
考虑转换参考系,给人和手雷都加上一个反向的重力加速度,则手雷做匀速直线运动,人做匀加速直线运动。
\(t\)秒后,人的位置是固定的,而手雷的位置是一个圆,手雷可以炸到人的范围也是一个圆(如左下图)。作出
如右下图所示的三角形,可以用余弦定理求得手雷可以炸到人的仰角\(\theta\) 。
根据球冠表面积公式,可以炸到人的部分的表面积为\(2pi(vt)^2(1-cos\theta)\),球的表面积为\(4pi(vt)^2\) ,故
答案为 \(1-\frac{(1-cos\theta)}{2}\),将余弦定理得到的 的表达式代入即可(注意特判炸不到和一定会炸到的情况)。
自己的一些感想
本来觉得是应该\(1-2\theta/360\) 但是其实不是,因为这不只是一个平面,而是一个球,所以要使用面积比,球冠表面
积公式是用二重积分算的但我高数学的是啥啊 仔细去想想感觉这个题目挺有意思的
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e6+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
ll t,v,r;
ll qpow(ll a,ll b){
ll ans=1,base=a;
while(b){
if(b&1) ans=ans*base%mod;
base=base*base%mod;
b=b>>1;
}
return ans;
}
signed main(){
int _;scanf("%d",&_);
while(_--){
scanf("%lld%lld%lld",&t,&v,&r);
ll a=5*t*t;
ll b=v*t;
ll ans=-1;
if(a>=b+r||b>=r+a){
ans=1;
}else if(r>=a+b){
ans=0;
}else{
ll co=(b*b+a*a-r*r)*qpow((2*a*b),mod-2)%mod;
ans=((co+1)*qpow(2,mod-2)%mod+mod)%mod;
}
printf("%lld\n",ans);
}
return 0;
}
不摆烂了,写题