[关闭]
@994495jj 2017-09-26T12:12:00.000000Z 字数 1009 阅读 1018

hdu6158

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


题意

笛卡尔定理

韦达定理

题解

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef double db;
  4. const db eps=1e-13;
  5. const db pi=acos(-1);
  6. const int N=15;
  7. int r1,r2,n;
  8. db k1,k2,ki,kii;
  9. db k[N];
  10. int main() {
  11. int T;scanf("%d",&T);
  12. while(T--) {
  13. scanf("%d%d%d",&r1,&r2,&n);
  14. if(r1<r2) swap(r1,r2);
  15. k1=-1.0/r1;k2=1.0/r2;
  16. db ans=0,r=0;
  17. rep(i,1,n+1) {
  18. if(i==1) {
  19. r=r1-r2;
  20. k[1]=1/r;
  21. } else if(i%2==0) {
  22. if(i==2) {
  23. k[2]=k1+k2+k[1];
  24. r=1/k[2];
  25. } else if(i==4) {
  26. k[4]=2*(k1+k2+k[2])-k[1];
  27. r=1/k[4];
  28. ki=k[2];kii=k[4];
  29. } else {
  30. db tk=2*(k1+k2+kii)-ki;
  31. r=1/tk;
  32. ki=kii;kii=tk;
  33. }
  34. }
  35. if(r*r<eps) break;
  36. ans=ans+r*r;
  37. }
  38. printf("%.5f\n",ans*pi);
  39. }
  40. return 0;
  41. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注