莫名其妙就AC了……

圆的反演……

神马是反演?

快去恶补奥数……

#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const double pi=acos(-1.0);
const double eps=1e-9;
int dcmp(double x){return fabs(x)<eps?0:x<0?-1:1;}
struct dot
{
double x,y;
dot(){}
dot(double a,double b){x=a;y=b;}
dot operator +(dot a){return dot(x+a.x,y+a.y);}
dot operator -(dot a){return dot(x-a.x,y-a.y);}
dot operator *(double a){return dot(x*a,y*a);}
double operator *(dot a){return x*a.y-y*a.x;}
dot operator /(double a){return dot(x/a,y/a);}
double operator /(dot a){return x*a.x+y*a.y;}
bool operator ==(dot a){return x==a.x&&y==a.y;}
void in(){scanf("%lf%lf",&x,&y);}
void out(){printf("%f %f\n",x,y);}
dot norv(){return dot(-y,x);}
dot univ(){double a=mod();return dot(x/a,y/a);}
dot ro(double a){return dot(x*cos(a)-y*sin(a),x*sin(a)+y*cos(a));}
double mod(){return sqrt(x*x+y*y);}
double dis(dot a){return sqrt(pow(x-a.x,2)+pow(y-a.y,2));}
};
struct cir
{
dot o;
double r;
cir(){}
cir(dot a,double b){o=a;r=b;}
void in(){o.in();scanf("%lf",&r);}
};
struct seg
{
dot s,e;
seg(){}
seg(dot a,dot b){s=a;e=b;}
};
cir sivs(dot a,dot b,dot c)
{
dot dir,a1,b1;
double t,d,w;
t=fabs((b-a)*(c-a));
d=a.dis(b);
t/=d;
w=0.5/t;
dir=(b-a).norv();
a1=c+dir*(w/d);
b1=c-dir*(w/d);
if(fabs((b-a)*(a1-a))<fabs((b-a)*(b1-a)))
return cir(a1,w);
else
return cir(b1,w);
}
cir civs(cir a,dot b)
{
cir c;
double t,x,y,s;
t=a.o.dis(b);
x=1.0/(t-a.r);
y=1.0/(t+a.r);
c.r=(x-y)/2.0;
s=(x+y)/2.0;
c.o=b+(a.o-b)*(s/t);
return c;
}
seg se[2];
void comseg(dot a,double r1,dot b,double r2)
{
double ang;
ang=acos((r1-r2)/a.dis(b));
se[0].s=a+(b-a).ro(ang).univ()*r1;
se[1].s=a+(b-a).ro(-ang).univ()*r1;
ang=pi-ang;
se[0].e=b+(a-b).ro(-ang).univ()*r2;
se[1].e=b+(a-b).ro(ang).univ()*r2;
}
int main()
{
int T,cnt,i;
cir a,b,a1,b1,ans[2];
dot c;
scanf("%d",&T);
while(T--)
{
a.in();
b.in();
c.in();
a1=civs(a,c);
b1=civs(b,c);
comseg(a1.o,a1.r,b1.o,b1.r);
cnt=0;
for(i=0;i<2;i++)
if(dcmp((a1.o-se[i].s)*(se[i].e-se[i].s))==dcmp((c-se[i].s)*(se[i].e-se[i].s)))
if(dcmp((b1.o-se[i].s)*(se[i].e-se[i].s))==dcmp((c-se[i].s)*(se[i].e-se[i].s)))
ans[cnt++]=sivs(se[i].s,se[i].e,c);
printf("%d\n",cnt);
for(i=0;i<cnt;i++)
printf("%.8f %.8f %.8f\n",ans[i].o.x,ans[i].o.y,ans[i].r);
}
}

Problem of Apollonius

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 551    Accepted Submission(s): 124

Special Judge

Problem Description
  Apollonius of Perga (ca. 262 BC - ca. 190 BC) was a Greek geometer and astronomer. In his noted work Epaphai, he posed and solved such a problem: constructing circles that are tangent to three given circles in a plane. Two tangent
circles can be internally or externally tangent to each other, thus Apollonius's problem generically have eight solutions.


  Now considering a simplified case of Apollonius's problem: constructing circles that are externally tangent to two given circles, and touches a given point(the given point must be on the circle which you find, can't be inside the circle). In addition, two
given circles have no common points, and neither of them are contained by the other, and the given point is also located strictly outside the given circles. You should be thankful that modern mathematics provides you with plenty of useful tools other than
euclidean geometry that help you a lot in this problem.
 
Input
  The first line of input contains an integer T (T ≤ 200), indicating the number of cases.

  Each ease has eight positive integers x1, y1, r1, x2, y2, r2, x3, y3 in a single line, stating two circles whose centres are (x1, y1), (x2, y2) and radius are r1 and r2 respectively, and a point located at (x3, y3). All integers are no larger than one hundred.
 
Output
  For each case, firstly output an integer S, indicating the number of solutions.

  Then output S lines, each line contains three float numbers x, y and r, meaning that a circle, whose center is (x, y) and radius is r, is a solution to this case. If there are multiple solutions (S > 1), outputing them in&nbsp;any order is OK. Your answer
will be accepted if your absolute error for each number is no more than 10-4.

 
Sample Input
1
12 10 1 8 10 1 10 10
 
Sample Output
2
10.00000000 8.50000000 1.50000000
10.00000000 11.50000000 1.50000000
Hint
This problem is special judged.
 
Source
 

hdu 4773 Problem of Apollonius的更多相关文章

  1. 【HDU】4773 Problem of Apollonius

    题意 给定相离的两个圆(圆心坐标以及半径)以及圆外的一个定点\(P\),求出过点\(P\)的且与已知的两个圆外切的所有圆(输出总数+圆心.半径). 分析 如果强行解方程,反正我是不会. 本题用到新姿势 ...

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

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

  3. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

  4. hdu String Problem(最小表示法入门题)

    hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...

  5. HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  6. HDU 5687 Problem C 【字典树删除】

    传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...

  7. HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)

    6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...

  8. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

  9. HDU 5687 Problem C(Trie+坑)

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

随机推荐

  1. Aspose.Cells 导入导出EXCEL(转)

    Aspose.Cells 导入导出EXCEL      修改样式        Workbook workbook = new Workbook(); //工作簿          Worksheet ...

  2. [原博客] BZOJ 2725 : [Violet 6]故乡的梦

    这个题在bzoj上好像是个权限题,想做的可以去Vani的博客下载测试数据.这里有题面. 简单叙述一下题意:给你一个n个点.m条边的带权无向图,S点和T点,询问Q次删一条给定的边的S-T最短路. 其中  ...

  3. 导入旧版本Android项目时的“Unable to resolve target ‘android

    在Ecplise + ATD + Android SDK的开发中,导入旧版本的Android项目时,往往会出现类似的如下错误 Error:Unable to resolve target 'andro ...

  4. OneAlert 入门(三)——事件分析

    OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.有了 OneAlert,你可以更快更合理地为事件划分 ...

  5. CycleScrollView实现轮播图

    // //  CycleScrollView.h //  PagedScrollView // //  Created by 李洪强 on 16-1-23. //  Copyright (c) 201 ...

  6. Linux下实现定时器Timer的几种方法

    http://blog.csdn.net/lxmky/article/details/7669296 第六章 IO复用:select和poll函数 http://www.cnblogs.com/4ti ...

  7. 程序异常捕获库 - CrashRpt

    CrashRpt.dll用来在应用程序出现异常crash时,捕获到错误. 并收集出错信息: MiniDump文件.硬件信息.系统信息.出错信息.进程信息.服务信息.驱动信息.启动信息.软件列表.端口信 ...

  8. Qt 子窗口内嵌到父窗口中(无边框附体show即可)good

    有时需要把一个子窗口内嵌进入父窗口当中. 我们可以这样做 1.新建一个QWidget 或者QDialog的子类 ClassA(父类为ClassB) 2.在新建类的构造函数中添加设置窗口属性 setWi ...

  9. 【CF】86 B. Petr#

    误以为是求满足条件的substring总数(解法是KMP分别以Sbeg和Send作为模式串求解满足条件的position,然后O(n^2)或者O(nlgn)求解).后来发现是求set(all vali ...

  10. hadoop2.2编程: 重写comparactor

    要点: 类型比较在hadoop的mapreduce中非常重要,主要用来比较keys; hadoop中的RawComparator<T>接口继承自java的comparator, 主要用来比 ...