给定一个无限大的二维平面,设点 S 为该平面的中心点。
设经过点 S 的垂直方向的直线为 P,如果直线 P 是一个圆的切线,且切点恰好为点 S,那么:
- 如果该圆位于直线 P 的右侧,则称之为右圆。
- 如果该圆位于直线 P的左侧,则称之为左圆。
现在,给定三个整数 R,A,B,你需要按照右圆、左圆、右圆、左圆…的顺序不断画圆,具体要求如下:
- 第一个右圆的半径等于 R。
- 每个左圆的半径等于你画的上一个圆的半径乘以 A。
- 每个右圆(第一个除外)的半径等于你画的上一个圆的半径除以 B(向下取整)。
- 当你要画的圆的半径等于 00 时,绘画停止。
请你计算,所有画出的圆的面积之和。
保证绘画会在有限数量的步骤后停止。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含三个整数 R,A,B。
输出格式
每组数据输出一个结果,每个结果占一行。
结果表示为 Case #x: y
,其中 x 为组别编号(从 11 开始),y为面积和(实数)。
y 在正确答案的 10−6 的绝对或相对误差范围内,则视为正确。
数据范围
1≤T≤100
1≤R≤105
1≤A≤500
2×A≤B≤1000
输入样例:
2
1 3 6
5 2 5
输出样例:
Case #1: 31.415927
Case #2: 455.530935
样例解释
对于 case #1,首先画一个半径为 11 的右圆,然后画一个半径为 1×3=31×3=3 的左圆,随后停止绘画,因为下一个右圆的半径为 ⌊3/6⌋=0⌊3/6⌋=0。
对于 case #2:
- 第一步画一个半径为 5的右圆;
- 第二步画一个半径为 5×2=10的左圆;
- 第三步画一个半径为 ⌊10/5⌋=2的右圆;
- 第四步画一个半径为 2×2=4的左圆;
- 停止绘画,因为下一个右圆的半径为 ⌊4/5⌋=0
分析:
根据本题数据范围,基本三四十次可以得出结果所以模拟即可
首先分析题意,首先*a,再/b,再*a,再/b....
直到r等于即可
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double PI=acos(-1);
double area(double x)
{
return x*x*PI;
}
int main()
{
int T;
cin>>T;
for(int cases=1;cases<=T;cases++)
{
double res=0;
int r,a,b;
cin>>r>>a>>b;
res+=area(r);
while(r)
{
r*=a;
res+=area(r);
r/=b;
res+=area(r);
}
printf("Case #%d: %lf\n",cases,res);
}
return 0;
}