明显最小正多边形在三角形外接圆上,我们只要求圆心角的一小块,再x份数
且最小就是要边数越多(圆心角越小),可以看出多边形就越接近圆(面积越大)

数据会给三点坐标。三条边就出来了

三条边出来了我们就可以算出每条边对应的圆心角





然后就gcd(圆心角)g

圆心角小份面积/
份数

#include <bits/stdc++.h>
using namespace std;

const double pi=3.1415926535, ACC=2*pi/100;//这里最小应该这样写,题目说最小100边,圆心角最多100份,太小如1e-6会出错
double x[3],y[3],edge[3],p,tmp,s,r,a,b,c,angle[3],gcdt,sums;

double gcd(double a,double b){
	if(fabs(a)<ACC) return b;
	if(fabs(b)<ACC) return a;
	return gcd(b,fmod(a,b));
}
int main(int argc, char** argv) {
	for(int i=0;i<3;i++){
		cin>>x[i]>>y[i];
	}
	for(int i=0;i<2;i++){
		edge[i]=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]));
		p+=edge[i];
	}
	edge[2]=sqrt((x[2]-x[0])*(x[2]-x[0])+(y[2]-y[0])*(y[2]-y[0]));
	p+=edge[2];
	p/=2;
	tmp=1;
	for(int i=0;i<3;i++) tmp*=p-edge[i];
	s=sqrt(p*tmp);
	r=edge[0]*edge[1]*edge[2]/s/4;
	for(int i=0;i<2;i++){
		angle[i]=acos(1-edge[i]*edge[i]/2/r/r);
	}
	angle[2]=2*pi-angle[0]-angle[1];
	gcdt=gcd(angle[0],gcd(angle[1],angle[2]));
	sums=pi*r*r*sin(gcdt)/gcdt;
	printf("%.6lf\n",sums);
	return 0;
}


这里注意下double的gcd:gcd(b,a%b)
由于是小于100边的,所以gcd圆心角就应该小于2π/100,如果太小了就会出错:比如本来最小的2π/90,但精度太小gcd变成2π/810
fmod(a,b)就是a/b的余数