hdu 6158(数学定理)
The Designer 笛卡尔定理 递推
http://acm.hdu.edu.cn/showproblem.php?pid=6158
阳哥原文:https://swustacm.cn/?p=426
一个大圆和三个小圆内切,三个小圆相互外切,他们的半径满足如下等式:
计算有标号圆的面积。
设大圆半径为,左边的圆半径为。则
只看上半部分的圆,对圆重新编号为1、2、3、……
设第个圆的半径为,根据笛卡尔定理有如下等式
同时也有
上下两式相减,得到
将右边展开,得到
两边同时消去,得到
合并同类项,得到
移项得到
这是一个关于的递推式,知道前两项就能递推出后一项。
但是现在只知道,还不知道,无法进行递推。
根据笛卡尔定理有
将其左右展开有
移项合并同类型,得到如下
将看作未知量,根据实际情况,方程的两个根应该相同,所以根据韦达定理有
则
已经求得和,可以递推了。
代码:
#include<bits/stdc++.h> using namespace std; const double esp=1e-13; const double PI=acos(-1.0); int main() { int T; scanf("%d",&T); while(T--) { int ra,rb,n; scanf("%d%d%d",&ra,&rb,&n); if(ra<rb) swap(ra,rb); double r1=ra-rb; double k1=1.0/ra,k2=1.0/rb,k3=1.0/r1; double k4=k3+k2-k1; double ans=r1*r1; n--; for(int i=1;i<=n;i+=2) { double r2=1.0/k4; if(r2*r2<esp) break; ans+=r2*r2; if((i+1)<=n) ans+=r2*r2; double k5=2*(k4+k2-k1)-k3; k3=k4,k4=k5; } printf("%.5f\n",ans*PI); } return 0; }