这道题目真是良心啊,没有卡精度
需要知道的知识:
- 基础的概率论
- 简单的微积分
天马行空的想象力
分3种情况讨论:
第一种情况
输入的(S)是大于(a imes b)的,那么这个概率就是0%。
第二种情况
如果输入的(S)太小了,无限接近于0的话,那么概率就无限接近100%(良心出题人,没有卡这里的精度,如果再卡卡就要弄死我了)
第三种情况
也就是一般的情况
这里需要一些基础的初中数学知识来帮我们计算这个概率。
- 因为这个区域是用平面直角坐标系的形式来描述的,所以我们可以运用分治的思想,沿(x)轴和(y)轴,把这个矩形分成4份。
- 然后根据这个对称性,我们容易知道,直接在([0,a]*[0,b])的矩形内取点即可,答案不用除以4
- 然后?
说过了要天马行空的想象力,那么我们来瞎搞吧qwq
具体思路:
- 设取出的(P)点的坐标是((x,y))
- 那么我们可以知道,以(OP)为对角线的长方形面积就是等于(x imes y)
- 当(xy>S)的时候,就是我们需要的。但是,不等式十分的(**),所以,我们考虑函数来解释几何:当(xy=S)时,也即(y=frac{S}{x})时,所成的函数曲线在矩形([0,a]*[0,b])以上的面积,再去除以这个矩形的总面积,就是答案了。
- 用定积分计算出这个矩形下面的面积,再用矩形的面积减去这个下面的面积,就是上面的面积。
所以我们要来搞搞喜闻乐见的定积分计算了
函数(y=frac{S}{x})是个反比例函数,也即双曲线函数。之前说过了,我们只讨论在第一象限内的玩意。
由于反比例函数的性质,我们容易知道,这个函数与矩阵的交点在((frac{S}{b},b)),然后这个玩意的左边那个矩形的高是(a),所以我们应该在([frac{S}{b},a])这个范围内对函数(y=frac{S}{x})进行积分.
scw曾经不知天高地厚地背过积分表,然后……就用上了啊
推式子:
( ext{下边的面积}=S+S imes int_{frac{S}{b}}^{a}frac{1}{x}\,dx)
(;;;;;\,;;;;;;;;;;;;;\,=S+S imes (ln a-ln frac{S}{b}))
//记得这个(intfrac{1}{x}\,dx=ln x),然后套上牛顿--莱布尼兹公式
(;;;;;\,;;;;;;;;;;;;;\,=S+S imes (ln frac{ab}{S}))
//(ln)的性质
(;;;;;\,;;;;;;;;;;;;;\,=S imes (1+ln frac{ab}{S}))
(;;;;;\,;;;;;;;;;;;;;\,=S imes (1+ln frac{ab}{S}))
(Answer=frac{ ext{上面的面积}}{ ext{总面积}})
(;;;;;;;;;;;;;\,=frac{ ext{总面积-下面的面积}}{ ext{总面积}})
(;;;;;;;;;;;;;\,=frac{ab-S imes (1+ln frac{ab}{S})}{ab})
然后?没了啊,就是这个基础的积分。如果没背过积分表的人可以用自适应辛普森算法(题解区里好像有人写?菜鸡的我不会……哭卿卿)
#include <bits/stdc++.h>
using namespace std;
int n;
double a,b,s;
int main()
{
cin>>n;
while(n--)
{
cin>>a>>b>>s;
if(s>a*b) cout<<"0.000000%"<<endl;
else if(s<0.001) cout<<"100.000000%"<<endl;
else
{
double ans=100.0*(a*b-s*(1+log(a*b/s)))/a/b;
printf("%.6lf",ans);
cout<<"%"<<endl;
}
}
return 0;
}
(很好奇为啥第一篇题解是printf的%啊,多麻烦,敲俩%,cout只要敲一个%,剩下一个去%管理员去不好吗)
qwq就是这样子辣,喵喵喵(概率论真是很可爱呢)