题意:给你两个内切圆的半径,然后在两个圆之间放n个圆,这n个圆的面积是多少。
思路:学习完圆的反演后,这道题就变得很轻松了,设两个内切圆的切点为反演中心,这样两个圆就会反演成两条直线,n个小院反演成相同大小的圆切于两条直线中,然后依次计算每个小圆的面积即可,注意精度。
附上代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
const double eps = 1e-13;
const double pi = acos(-1.0);
int r1, r2, n;
double mul2(double x) {
return x * x;
}
int main(void)
{
int T;
scanf("%d", &T);
while (T--) {
scanf("%d %d %d", &r1, &r2, &n);
if (r1 < r2) swap(r1, r2);
double r3 = r1 - r2;
double ans = mul2(r3);
n--;
double R = 2 * r1;
double r = (mul2(R) / (2 * r2) - R) / 2;
double L = R + r;
for (int i = 0, j = 1; i < n; i += 2, ++j) {
double t = sqrt(mul2(L) + mul2(2 * j * r));
double tmpr = (mul2(R) / (t - r) - mul2(R) / (t + r)) / 2;
if (mul2(tmpr) < eps) break;
if (i + 1 == n) ans += mul2(tmpr);
else ans += 2 * mul2(tmpr);
}
printf("%.5lf\n", ans * pi);
}
return 0;
}