CodeForces 1C - Ancient Berland Circus

这道也太数学了吧!
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <algorithm>
#include <cctype>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <iomanip>
#include <set>
#include <vector>
#include <cstdio>
#include <stack>
#include <sstream>
#include <cstring>
using namespace std;
const int MAX=1000005;
const double Pi=acos(-1.0);
struct node
{
    double x,y;
};
double dis(node a,node b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));//距离公式
}
double a1cos(double a,double b,double c)
{
    return acos((a*a+b*b-c*c)/(2*a*b));//余弦公式
}
double S(double a,double b,double c)
{
    double tmp=(a+b+c)/2;
    return sqrt(tmp*(tmp-a)*(tmp-b)*(tmp-c));//海伦公式求面积
}
double gcd(double a,double b)
{
    return b>1e-4?gcd(b,a-floor(a/b)*b):a;//求角的最大公约数
}
int main()
{
    node a,b,c;
    cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y;
    double d1=dis(a,b);
    double d2=dis(b,c);
    double d3=dis(a,c);
    double s1=S(d1,d2,d3);
    double sr=d1*d2*d3/(4*s1);//求圆的半径
    //cout<<sr<<endl;
    double ac=a1cos(d2,d3,d1);
    double bc=a1cos(d1,d3,d2);
    double cc=a1cos(d1,d2,d3);
    double tmp1=gcd(ac,gcd(bc,cc));
    double num=Pi/tmp1;
    //cout<<num<<endl;
    printf("%.8lf\n",sr*sr/2*sin(2*Pi/num)*num);
    return 0;
}

你可能感兴趣的:(算法,CF)