莫名其妙就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. hdu10007

    题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半. 第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标.实数. 这个题目其实就是求最近点对的距离   #include< ...

  2. citrix xen server 虚拟机无法关闭的问题

    悲剧的一台windows的虚拟机无法重启无法关机.如下图,一直卡住不动. 首先找到这台机器: [root@xenserver- xen]# xe vm-list name-label=-vss\ se ...

  3. STM32启动过程--启动文件--分析

    一.概述 1.说明 每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道.通过了解启动文件,我们可以体会到处理器的架构.指令集.中断向量安排等内容,是非常值得玩味的. ST ...

  4. javax.servlet不存在的问题

    摘自:http://blog.csdn.net/tgeh23/article/details/2216682     最近在学习servlet,看书看的似乎还比较理想就想上机试下,这一试就发现,问题来 ...

  5. 1500: [NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  6. URL参数加密解密

    /// <summary>        /// DES加密字符串        /// </summary>        /// <param name=" ...

  7. delphi xe5 android 手机上使用sqlite

    本篇我们介绍一下在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank ap ...

  8. 天草(初级+中级+高级)VIP和黑鹰VIP破解教程(全部iso下载地址)

    以下就是我收集的教程地址,之前我收集到的都是一课一课下载的,虽然这样,我也下载完了天草的全部课程.这里分享的是在一起的iso文件,比起一课课下载爽多了.~~ 还有这些教程都是从零起点开始教的,不用担心 ...

  9. Spring 定时任务 quartz的配置

    环境:我用的是spring3.2,其中引入了quartz-1.5.2.jar 先写一个任务类: package com.hlcg.common.task; public class TestJob { ...

  10. 在老项目中使用Gradle:更改默认目录结构

    apply plugin: 'war' sourceCompatibility = 1.5 version = "1.0" //中央仓库 repositories { mavenC ...