[关闭]
@994495jj 2017-08-22T12:24:58.000000Z 字数 914 阅读 714

hdu6158

201708 (ACM)计算几何----圆反演


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. typedef long long ll;
  11. typedef double db;
  12. typedef pair<int, int> pii;
  13. typedef vector<int> vi;
  14. //--------
  15. const db eps=1e-13;
  16. const db pi=acos(-1);
  17. int r1,r2,n;
  18. struct P {
  19. db x,y;
  20. P() {}
  21. P(db x,db y) {
  22. this -> x = x;
  23. this -> y = y;
  24. }
  25. P operator - (const P &c) const {
  26. return P(x - c.x, y - c.y);
  27. }
  28. };
  29. db dis(P a) {
  30. return sqrt(a.x*a.x+a.y*a.y);
  31. }
  32. db dis(P a,P b) {
  33. return dis(a-b);
  34. }
  35. db gao(db x) {
  36. return 1/x;
  37. }
  38. int main() {
  39. int T;scanf("%d",&T);
  40. while(T--) {
  41. scanf("%d%d%d",&r1,&r2,&n);
  42. if(r1<r2) swap(r1,r2);
  43. db x1=gao(2*r1),x2=gao(2*r2);
  44. db d=x2-x1;
  45. db ans=0,r=0;
  46. P o = P(0, 0);
  47. rep(i,1,n+1) {
  48. if(i==1) {
  49. r=r1-r2;
  50. } else if(i%2==0) {
  51. P c = P(x1+d/2, d*i/2);
  52. db dc = dis(c, o);
  53. db da=dc-d/2,d_=dc+d/2;
  54. db a=gao(da),b=gao(d_);
  55. r=fabs(a-b)/2;
  56. }
  57. ans+=r*r;
  58. if(r*r<eps) break;
  59. }
  60. printf("%.5f\n",ans*pi);
  61. }
  62. return 0;
  63. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注