题面

传送门

这题有两种方法(然而两种我都想不到)

方法一

前置芝士

笛卡尔定理

我们定义一个圆的曲率为\(k=\pm {1\over r}\),其中\(r\)是圆的半径

若在平面上有两两相切,且六个切点互不相同的四个圆,设其曲率分别为\(k1,k2,k3,k4\)(若该圆和其它所有圆都外切,则其曲率取正,否则曲率取负),则有

\[(k1+k2+k3+k4)^2=2(k1^2+k2^2+k3^2+k4^2)
\]

类似的,若是空间中有两两相切且切点互不相同的五个球体,则有

\[(k1+k2+k3+k4+k5)^2=3(k1^2+k2^2+k3^2+k4^2+k5^2)
\]

题解

首先那个粉色圆的直径就是\(R-r\),于是我们现在知道前三个圆的半径了

上面的柿子可以看做一个关于\(k4\)的方程,化简一下可得

\[k4^2-2(k1+k2+k3)k4+2(k1^2+k2^2+k3^2)-(k1+k2+k3)^2=0
\]

这方程一看就很不好解的样子……

想想我们初中时候学过的韦达定理,对于方程\(ax^2+bx+c=0\),设它的两个解为\(x_1,x_2\),则有

\[x_1+x_2=-{b\over a}
\]

设\(k3\)代表绿圆\(i\)的曲率,\(k2\)代表黄圆的曲率,\(k1\)代表最大的圆的曲率,我们要求的就是与这三个圆都相切的圆的曲率……

但是这里是两个解的和的形式怎么办丫……

冷静想想,和这三个圆都相切的圆,除了绿圆\(i+1\),似乎只剩下绿圆\(i-1\)?而\(i-1\)的曲率我们之前已经知道了?

那么我们就可以\(O(n)\)递推了,时间复杂度\(O(nT)\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res;R char ch;
while((ch=getc())>'9'||ch<'0');
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res;
}
int n,R1,R2,R3;double r1,r2,r3,r4,r5;
int main(){
// freopen("testdata.in","r",stdin);
for(int T=read();T;--T){
R1=read(),R2=read(),n=read(),R3=R1-R2;
r1=-1.0/R1,r2=1.0/R2,r3=1.0/R3,r4=r1+r2+r3;
fp(i,2,n)r5=r3,r3=r4,r4=(r1+r2+r3)*2-r5;
printf("%.10lf\n",1.0/r4);
}
return 0;
}

方法二

前置芝士

圆的反演

题解

我们设黄圆为\(A\),绿圆为\(B\),大圆就叫大圆,并且以下假设\(A\)和大圆的交点为原点,这三个圆共同的直径为\(x\)轴

如果我们以原点为反演中心,那么反演之后\(A\)和大圆会变成两条直线。又因为反演不改变相切关系,所以\(B\)反演之后就在这两条直线中间。显然\(B\)反演之后的圆心仍在\(x\)轴上

如果我们还要放上别的圆(假设一直往上放),由于它与这三个圆有唯一交点,所以肯定是被卡在两条直线中间,且刚好在之前的圆上方

因为这些圆的半径相同,我们可以\(O(1)\)得到第\(n\)个圆的圆心的坐标。之后我们连接圆心和原点,这条直线和圆的两个交点分别记为\(p1,p2\),把它们反演回来,对应的两个点之间的距离就是原来的第\(n\)个圆的半径了

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
struct node{
double x,y;
inline node(){}
inline node(R double xx,R double yy):x(xx),y(yy){}
inline node operator +(const node &b)const{return node(x+b.x,y+b.y);}
inline node operator -(const node &b)const{return node(x-b.x,y-b.y);}
inline node operator *(const double &b)const{return node(x*b,y*b);}
inline double norm(){return sqrt(x*x+y*y);}
}p,pp,o;
int n,r1,r2;double r,lx,rx,ir;
void get(R node o,R double k,R double b){
double del=ir/sqrt(k*k+1);
p=node(o.x-del,k*(o.x-del)+b),
pp=node(o.x+del,k*(o.x+del)+b);
}
inline node inv(R node p){
double len=1.0/p.norm();
return p*(r*r*len*len);
}
int main(){
// freopen("testdata.in","r",stdin);
for(int T=read();T;--T){
r1=read(),r2=read(),n=read(),r=r2*0.5;
lx=r*r/(r1*2),rx=r*r/(r2*2),ir=(rx-lx)*0.5;
o=node((lx+rx)*0.5,2*n*ir);
get(o,o.y/o.x,0);
printf("%.10lf\n",(inv(p)-inv(pp)).norm()*0.5);
}
return 0;
}

CF77E Martian Food(圆的反演or 笛卡尔定理+韦达定理)的更多相关文章

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

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

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

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

  3. HDU 6158 笛卡尔定理 几何

    LINK 题意:一个大圆中内切两个圆,三个圆两两相切,再不断往上加新的相切圆,问加上的圆的面积和.具体切法看图 思路:笛卡尔定理: 若平面上四个半径为r1.r2.r3.r4的圆两两相切于不同点,则其半 ...

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

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

  5. 圆的反演变换(HDU4773)

    题意:给出两个相离的圆O1,O2和圆外一点P,求构造这样的圆:同时与两个圆相外切,且经过点P,输出圆的圆心和半径 分析:画图很容易看出这样的圆要么存在一个,要么存在两个:此题直接解方程是不容易的,先看 ...

  6. 「HDU6158」 The Designer(圆的反演)

    题目链接多校8-1009 HDU - 6158 The Designer 题意 T(<=1200)组,如图在半径R1.R2相内切的圆的差集位置依次绘制1,2,3,到n号圆,求面积之和(n< ...

  7. 【 HDU4773 】Problem of Apollonius (圆的反演)

    BUPT2017 wintertraining(15) #5G HDU - 4773 - 2013 Asia Hangzhou Regional Contest problem D 题意 给定两个相离 ...

  8. Pick定理、欧拉公式和圆的反演

    Pick定理.欧拉公式和圆的反演 Tags:高级算法 Pick定理 内容 定点都是整点的多边形,内部整点数为\(innod\),边界整点数\(ednod\),\(S=innod+\frac{ednod ...

  9. HOJ 13102 Super Shuttle (圆的反演变换)

    HOJ 13102 Super Shuttle 链接:http://49.123.82.55/online/?action=problem&type=show&id=13102 题意: ...

随机推荐

  1. iframe 元素会创建包含另外一个文档的内联框架(即行内框架)

    HTML 与 XHTML 之间的差异 在 HTML 4.1 Strict DTD 和 XHTML 1.0 Strict DTD 中,不支持 iframe 元素. 提示和注释: 提示:您可以把需要的文本 ...

  2. JAXB--@XmlElementWrapper注解(二)

    在JAXB标准中,@XmlElementWrapper注解表示生成一个包装 XML 表示形式的包装器元素. 此元素主要用于生成一个包装集合的包装器 XML 元素.因此,该注释支持以下两种形式的序列化. ...

  3. mysql 塞数据

    ./mysql_.py -H109.105.4.65 -P32773 -uroot -proot.123 --database=test_database --number=10 sysbench - ...

  4. testng参数化(提供测试数据)

    testng提供测试数据的两个注释:@DataProvide和@Parameter   一.通过testng.xml中设置参数 (实际上testng.xml只是一个名字,可以起任何一个名字,只要是.x ...

  5. write()和print()还有<%= %>的细微区别

    1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等 (2).print():可以将各种类型(包括Object)的数据通过默 ...

  6. jQuery插件Highcharts

    Highcharts 是一个用纯 JavaScript 编写的一个图表库, 能够很简单便捷的在 Web 网站或是 Web 应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用. ...

  7. SQLServer性能优化之---水平分库扩展

      汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 第一次引入文件组的概念:http://www.cnblogs.com/dunitia ...

  8. 在线编辑器CKeditor,CKfinder

    在线编辑器的分类: 常见的在线编辑器有很多,比较常用的有FCKeditor(在线编辑器——Ajax 浏览器 端服务器文件管理器),CKeditor(在线编辑器与服务器端文件管理器的分离,) 其中CKe ...

  9. 阿里云自定义监控tomcat进程数

    阿里云提供自定义监控SDK,这有助于我们定制化的根据自身业务来做监控,下面我就根据业务需求来介绍一个简单的自定义监控配置. 阿里提供了2个版本的自定义监控接口:自定义监控SDK(python版) :c ...

  10. win10 跳过max path 260限制

    参考: https://www.howtogeek.com/266621/how-to-make-windows-10-accept-file-paths-over-260-characters/ 注 ...