LINK

题意:一个大圆中内切两个圆,三个圆两两相切,再不断往上加新的相切圆,问加上的圆的面积和。具体切法看图

思路:笛卡尔定理:

若平面上四个半径为r1、r2、r3、r4的圆两两相切于不同点,则其半径满足以下结论:
          (1)若四圆两两外切,则
  
          (2)若半径为r1、r2、r3的圆内切于半径为r4的圆中,则

  
显然现在是第二种情况,设弧度为$k$则,$r_1,r_2,r_3,r_4$的弧度为$k_1,k_2,k_3,k_4$,其中$r_4$是下个我们要求的圆的半径,显然我们已知前三个圆,第四个圆可由递推求得。
那么,化简公式到这步$k_4^2 - {\color{red}{2(k_2 + k_3 - k_1)k_4}} - [2k_{2}k_{3} + 2k_{1}(k_2 + k_3) + k_2^2 + k_3^2 + k_1^2] = 0$ 
当$i>=4$时这里可以发现$k_i$的两个解就是$r_{i-1}$两侧的两个圆的弧度,其中一个圆是上一步得到的圆,那么我们可以使用伟达定理,即$k_{i} + k_{i-2} = 2(k_2 + k_{i-1} - k_1)k_i$,再移项得到递推式,除了第一个圆,每次画上下对称的两个圆,注意由于$n<=10^7$,如果全部递推会超时,所以还要剪掉面积太小的部分...这部分精度还不能太低..
老实说,以后再出纯数学题,照样还是做不来的,笛卡尔定理还是看了icpccamp上的题解才知道的..就当积累姿势好了。
说起来这道题在这里就有一道基本一模一样的数学题(例3)....
/** @Date    : 2017-08-21 15:31:07
* @FileName: 1009 笛卡尔定理.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-9;
const double Pi = acos(-1.0); int main()
{
int T;
cin >> T;
while(T--)
{
int n;
double r1, r2, r3, r4;
scanf("%lf%lf", &r1, &r2);
scanf("%d", &n);
if(r1 < r2) swap(r1, r2); r3 = r1 - r2;
double k1 = 1.0000 / r1, k2 = 1.0000 / r2, k3 = 1.0000/r3;
double k4 = k2 + k3 - k1;//k4 + k4 = -2(k2 + k3 - k1)/-1;
double ans = r3 * r3; n -= 1;
while(n > 0)
{
r4 = 1.0000 / k4;
double siz = r4 * r4;
if(siz < 1e-13) break; //减枝TLE 1e-9 精度太低
ans += siz * 2.0000;
double nk = 2.0000 * (k2 + k4 - k1) - k3;//k3 + k5 = 2 * (k2 + k4 - k1)
k3 = k4;
k4 = nk;
n -= 2;
}
if(n < 0)
ans -= r4 * r4;
printf("%.5lf\n", ans * Pi);
}
return 0;
}

HDU 6158 笛卡尔定理 几何的更多相关文章

  1. HDU 6158 笛卡尔定理+韦达定理

    The Designer Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  2. 爆炸几何之 CCPC网络赛 I - The Designer (笛卡尔定理)

    本文版权归BobHuang和博客园共有,不得转载.如想转载,请联系作者,并注明出处.   Nowadays, little hahahaha got a problem from his teache ...

  3. The Designer (笛卡尔定理+韦达定理 || 圆的反演)

    Nowadays, little haha got a problem from his teacher.His teacher wants to design a big logo for the ...

  4. CF77E Martian Food(圆的反演or 笛卡尔定理+韦达定理)

    题面 传送门 这题有两种方法(然而两种我都想不到) 方法一 前置芝士 笛卡尔定理 我们定义一个圆的曲率为\(k=\pm {1\over r}\),其中\(r\)是圆的半径 若在平面上有两两相切,且六个 ...

  5. 2018 Multi-University Training Contest 1 H - RMQ Similar Sequence(HDU - 6305 笛卡尔树)

    题意: 对于一个序列a,构造一个序列b,使得两个序列,对于任意的区间 [l, r] 的区间最靠近左端点的那个最大值的位置,并且序列 b 满足 0 < bi < 1. 给定一个序列 a ,求 ...

  6. HDU - 6158 The Designer

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6158 本题是一个计算几何题——四圆相切. 平面上的一对内切圆,半径分别为R和r.现在这一对内切圆之间,按 ...

  7. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  8. hdu 6305 RMQ Similar Sequence——概率方面的思路+笛卡尔树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6305 看题解,得知: 0~1内随机取实数,取到两个相同的数的概率是0,所以认为 b 序列是一个排列. 两个 ...

  9. hdu 1506 Largest Rectangle in a Histogram——笛卡尔树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 关于笛卡尔树的构建:https://www.cnblogs.com/reverymoon/p/952 ...

随机推荐

  1. 04慕课网《vue.js2.5入门》——Vue-cli开发todolist

    主要文件目录: 文件代码: 根实例,初始化vue: <!--index.html,网站入口页面,和main.jsp组成一套.vue文件,包含--> <!DOCTYPE html> ...

  2. Win10系统自带输入法的人机交互设计

    过了寒假回校以后,我的电脑重装了系统,为了提升系统运行的速度,自己装了一个内存条同时对硬盘进行了重新的分区,对电脑内的文件也进行了重新的整理,电脑的运行速度提高了很多.老多同学都说win10系统好用, ...

  3. SELECT - OVER 子句 (Transact-SQL)

    标题:SELECT - OVER 子句 (Transact-SQL) 地址:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/select-over ...

  4. Eclipse项目导入到Android Studio中

    背景 最近需要将Eclipse中的android项目导入到Android Studio中!倒腾一番,记录如下! 步骤1 打开Android Studio(下文称AS),选择Import project ...

  5. rsa加密算法,前后端实现。

    前端js: 下载地址:http://travistidwell.com/jsencrypt/ js第一版本: // 对数据加密 function encrypt(enStr){ //没有加载jsenc ...

  6. 【leetcode】54.Spiral Matrix

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  7. Linux学习笔记3

    touch filename 创建一个不存在的文件,或者修改文件的时间戳. touch log.txt whereis name 定位一个文件. whereis php.ini whereis.loc ...

  8. 网页显示百度地图 Jquery

    cshtml: <div class="modal" style="visibility: hidden"> <div id="ma ...

  9. HDU4045_Machine scheduling

    题意为要你从编号为1-n的所有机器中间选择出r个机器且每一个机器的编号只差不小于k-1,然后将选择的r个机器分为m组有多少种方案. 其实这题目的两个步骤是相互独立的. 总共的方案数等于选择的方案数乘以 ...

  10. 循环 与 next()