题目描述
有一个流行的狂欢节游戏,一枚硬币被抛到一张桌子上,而在桌子上有一个被方砖以网格的形式所覆盖的网格区域。游戏奖品取决于硬币在静止的时候所盖到的方砖数量:盖到的方砖越多,奖品就越好。下图给出了五种抛硬币的情况:
在上述实例中,
- 硬币1盖到1块方砖;
- 硬币2盖到2块方砖;
- 硬币3盖到3块方砖;
- 硬币4盖到4块方砖;
- 硬币5盖到2块方砖;
这里要说明的是,硬币落在网格区域的边界线上也是可以接受的(比如,硬币5的情况)。所谓一枚硬币盖到一块方砖,就是硬币要盖住了方砖的一部分面积;也就是说,硬币仅仅和方砖的边界线相切是不够的。硬币的圆心可以在网格区域中的任何一点,概率都是一样的。本题设定(1)硬币总是平放在的桌上;(2)玩家可以保证硬币的圆心总是在网格区域内,或在网格的边界线上。
一枚硬币盖到方砖数量的概率取决于方砖和硬币的大小,以及网格区域内方砖的行数和列数。在本题中,请您编写一个程序来计算一枚硬币盖到不同数量方砖的概率。
输入输出格式
输入格式
输入的第一行是一个整数,表示测试用例数。对于每个测试用例,在一行中给出4个用空格隔开的整数m, n, t和c;其中,网格区域由m行和n列方砖组成,方砖每条边的边长为t,硬币的直径为c。本题设定1≤m,n≤5000,1≤c<t≤1000。
输出格式 对于每个测试用例,在一行中输出测试用例的编号。然后给出1枚硬币盖到1块、2块、3块和4块方砖的概率。概率表示为四舍五入到小数点后4位的百分数。使用样例输出中给出的格式。请您使用双精度浮点数来执行计算。输出“负零(Negative zeros)”时,不输出负号。
在连续输出的测试用例之间,用空行分隔。
输入输出样例1
输入
3
5 5 10 3
7 4 25 20
10 10 10 4
输出
Case 1:
Probability of covering 1 tile = 57.7600%
Probability of covering 2 tiles = 36.4800%
Probability of covering 3 tiles = 1.2361%
Probability of covering 4 tiles = 4.5239%
Case 2:
Probability of covering 1 tile = 12.5714%
Probability of covering 2 tiles = 46.2857%
Probability of covering 3 tiles = 8.8293%
Probability of covering 4 tiles = 32.3135%
Case 3:
Probability of covering 1 tile = 40.9600%
Probability of covering 2 tiles = 46.0800%
Probability of covering 3 tiles = 2.7812%
Probability of covering 4 tiles = 10.1788%
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double PI = acos(-1.0);
int main()
{
double m, n, c, t; // m, n, t和c含义如题目描述
int T; // 测试用例数
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++)
{ // 一次循环处理一个测试用例
scanf("%lf%lf%lf%lf", &m, &n, &t, &c);
double sum = n * m * t * t; // 网格的总面积
double s2 = c * (t - c) * (2 * m * n - n - m) + c * (c / 2) * (2 * n + 2 * m - 4); // 盖到2块
double s4 = PI * c * c / 4.0 * (m - 1) * (n - 1); // 盖到4块
double s3 = (m - 1) * (n - 1) * c * c - s4; // 盖到3块
double s1 = sum - s2 - s3 - s4; // 盖到1块
// s1 = max(s1, 0.0); 考虑负零
printf("Case %d:\n", cas);
printf("Probability of covering 1 tile = %.4f%\n", s1 / sum * 100);
printf("Probability of covering 2 tiles = %.4f%\n", s2 / sum * 100);
printf("Probability of covering 3 tiles = %.4f%\n", s3 / sum * 100);
printf("Probability of covering 4 tiles = %.4f%\n", s4 / sum * 100);
if (cas != T)
puts("");
}
return 0;
}