HDU 6158 圆的反演
2017-10-05 14:28
316 查看
上一篇介绍了院的反演,这一篇就是一道网络赛圆的反演的题目。其实感觉这道题目有点…. 感觉它卡的东西不是太好 反正计算几何你一定要注意精度问题。emmmm…… 这个题目就是圆的反演,你只需要找对里面的几何关系就好了
注意由于反演 中具有一一对应的性质,只有原来相交的点到后面才会可能相交,剩下的就是圆的反演了 (这个东西没有模版).还有我们用反演变换的时候一般关注两个东西,一个是过反演中心的圆 (因为这种圆的反形是一条直线) 另一种情况我们关注不过反演中心的直线,因为这个的反形是圆。也一般在这种情况下我们才使用反演变换 多个圆的时候有时也会去考虑这种变换。
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> using namespace std; const double eps = 1e-7; const double PI = 3.141592653589793; int main () { int T; scanf ("%d",&T); while (T --) { double r1,r2; int n; scanf ("%lf%lf%d",&r1,&r2,&n); if (r1 < r2) swap (r1,r2); double r3 = r1 - r2; double ans = r3 * r3; double R = 4 * r1; double l = R / (2 * r1),r = R / (2 * r2); double rr = (r - l) / 2; int u = (n - 1)/ 2; int v = 0; if (n % 2 == 0) v = 1; double add = 2 * rr; double len = rr + l; for (int i = 1;i <= u + v; ++ i) { double dis = sqrt (add * add + len * len); add += 2 * rr; double l1 = dis - rr; double r1 = dis + rr; double ansr = (R / l1 - R / r1) / 2; ans += ansr * ansr * 2; if (i == u + v && v) { ans -= ansr * ansr; } if (ansr <= eps) break; } printf ("%.5f\n",ans*PI); } return 0; }
相关文章推荐
- hdu 6158 The Designer( 反演圆)
- hdu-6158-圆的反演
- HDU 6134 Battlestation Operational 2017多校8 莫比乌斯反演
- hdu 4746Mophues[莫比乌斯反演]
- [hdu 5072]Coprime 数论-莫比乌斯反演
- HDU - 4773 Problem of Apollonius 圆的反演
- HDU 6053 莫比乌斯反演
- HDU 6134 莫比乌斯反演
- hdu 6134 Battlestation Operational 莫比乌斯反演
- HDU 1695 莫比乌斯反演
- hdu 4773 几何反演 线->圆
- HDU - 6158
- HDU 6134 Battlestation Operational 莫比乌斯反演 + 数学推导
- hdu1695 GCD(反演)
- HDU 6097 Mindis【计算几何+反演点】
- 【HDU - 1465】 不容易系列之一 【错排 == 递推 or 二项式反演公式】
- hdu 1695 莫比乌斯反演
- hdu 6097 Mindis(几何反演)
- 莫比乌斯反演 hdu 4676 Sum Of Gcd
- hdu1695 莫比乌斯反演