hdu 6158(数学定理)

The Designer 笛卡尔定理 递推

http://acm.hdu.edu.cn/showproblem.php?pid=6158

阳哥原文:https://swustacm.cn/?p=426

 

一个大圆和三个小圆内切,三个小圆相互外切,他们的半径满足如下等式:

hdu 6158(数学定理)

计算有标号圆的面积。
设大圆半径为,左边的圆半径为。则
只看上半部分的圆,对圆重新编号为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;
}