HDU 6158 計算幾何 笛卡爾定理 + 韋達定理
阿新 • • 發佈:2019-01-04
題解已經講得非常清楚了,補充一點細節吧。
(1).關於笛卡爾定理
對於此題,只需要瞭解這麼一個性質:(來自wiki 用的谷歌翻譯,若有偏差還請指出~)
定義一個圓的曲率
若平面有兩兩相切,且有
(2).關於韋達定理
對於此題,第一個與已知圓相切的圓的半徑非常好求,其半徑
故我們現在 4
易發現這是一個關於
直接求解是挺困難的,設兩個解是
因為
對於題目給的圖:
若
若
這樣我們就可以類似迭代的方式,不斷往後遞推求解。
另外小心精度和時間的問題。
因為N越大,其後面的圓的面積對於答案的貢獻幾乎可以忽略不計,這時要及時退出迴圈,避免超時。
親測,當eps取(1e-13)時跑得最快。
218msAC
程式碼:
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const double eps = 1e-13;
const double PI = acos(-1.0);
int main(){
int T;scanf("%d",&T);
while(T--){
int r1,r2,n;
scanf ("%d%d%d",&r1,&r2,&n);
if(r1 < r2) swap(r1,r2);
double k1 = -1.0/r1,k2 = 1.0/r2,k3 = 1.0/(r1-r2);
double k4 = k1 + k2 + k3;
double ans = (r1-r2)*(r1-r2);
n--;
for(int i=1 ;i<=n ;i+=2){
double r4 = 1.0/k4;
if(r4*r4 < eps) break;
ans += r4*r4;if(i+1<=n) ans += r4*r4;
double k5 = 2*(k1+k2+k4) - k3;
k3 = k4;k4 = k5;
}
printf("%.5f\n",ans*PI);
}
return 0;
}