Ancient Berland Circus
如今,Berland 的所有马戏表演都有一个圆形的竞技场,其直径为 13 米,但过去的情况有所不同。
在古代 Berland,马戏表演的竞技场的形状为 (等角) 正多边形,其尺寸和角的度数在各马戏表演中可能各不相同。在竞技场的每个角上,有一根特殊的台柱,并且在不同台柱之间系上绳子用以标识竞技场的各条边。
最近,来自 Berland 的科学家们已经发现了某处古代马戏表演竞技场的遗址。他们只发现了三根台柱,其余的则随时间而损毁。
给定了这三根台柱的坐标。请找出该竞技场可能具有的最小面积。
输入
输入文件包含了三行,它们中的每行包含了一对数字 –– 台柱的坐标。任何方向的坐标,其绝对值均不超过 1000,且给出了小数点后至多 6 位的数字。
输出
输出古代竞技场可能的最小面积。该数值应当精确到小数点后至少 6 位数字。数据确保:最佳多边形的角度数不超过 100 。
示例
输入
0.000000 0.000000
1.000000 1.000000
0.000000 1.000000
输出
1.00000000
sol:这三个点肯定在这个三角形的外接圆上,求出圆心,求出半径,然后余弦定理求出三个圆心角,但是求Gcd很蛋碎,一开始我把eps弄成1e-8,疯狂WA,改成1e-4就过了
#include <bits/stdc++.h> using namespace std; typedef int ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar(' ') double ax,ay,bx,by,cx,cy; const double PI=acos(-1),eps=1e-4; inline double Sqr(double x) { return x*x; } inline double Jis(double x1,double y1,double x2,double y2) { return sqrt(Sqr(x2-x1)+Sqr(y2-y1)); } inline double Jis2(double x1,double y1,double x2,double y2) { return Sqr(x2-x1)+Sqr(y2-y1); } inline double gcd(double x,double y) { while(fabs(x)>eps&&fabs(y)>eps) { if(x>y) x-=floor(x/y)*y; else y-=floor(y/x)*x; } return x+y; } int main() { double Zx,Zy; scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy); double a=2*(bx-ax),b=2*(by-ay),c=Sqr(bx)+Sqr(by)-Sqr(ax)-Sqr(ay); double d=2*(cx-ax),e=2*(cy-ay),f=Sqr(cx)+Sqr(cy)-Sqr(ax)-Sqr(ay); Zx=(c*e/b-f)/(a*e/b-d); Zy=(c*d/a-f)/(b*d/a-e); double r=Jis(ax,ay,Zx,Zy),r2=Jis2(ax,ay,Zx,Zy); double ab=Jis(ax,ay,bx,by),ac=Jis(ax,ay,cx,cy),bc=Jis(bx,by,cx,cy); double ab2=Jis2(ax,ay,bx,by),ac2=Jis2(ax,ay,cx,cy),bc2=Jis2(bx,by,cx,cy); double Ang_ab=2.*acos((ac2+bc2-ab2)/(2.*ac*bc)); double Ang_ac=2.*acos((ab2+bc2-ac2)/(2.*ab*bc)); double Ang_bc=2.*acos((ac2+ab2-bc2)/(2.*ac*ab)); double Ang_Z=gcd(Ang_ac,gcd(Ang_ab,Ang_bc)); double S=.5*r*r*sin(Ang_Z); printf("%.15lf ",(2.*PI/Ang_Z)*S); return 0; } /* input 0.000000 0.000000 1.000000 1.000000 0.000000 1.000000 output 1.00000000 Input 71.756151 7.532275 -48.634784 100.159986 91.778633 158.107739 Output 9991.278665811225 Input 18.716839 40.852752 66.147248 -4.083161 111.083161 43.347248 Output 4268.87997505 Input 88.653021 18.024220 51.942488 -2.527850 76.164701 24.553012 Output 1452.52866331 */
Ps:我afo了,QAQ