HRBEU/HEUOJ----1018 Temple of Dune

来源:互联网 发布:linux系统tar命令 编辑:程序博客网 时间:2024/06/05 05:36

给了一个正多边形的三个顶点,求满足条件的最小边数的正多边形。一开始没考虑周全,自己意淫了一个算法,果断是错的,样例都跑不出来,后来看了一下大牛的解题报告,说让用浮点数gcd做,一试,还真好使。A了之后发现好像还可以把浮点数都扩大一百万倍按整数gcd做。

#include <iostream>#include <cstdio>#include <cmath>using namespace std;const double PI = 2.*asin(1.);const double eps = 1e-3;struct Point{double x,y;}p[3];double dis(Point a,Point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double deg(double a,double b,double c){return acos((a*a+b*b-c*c)/2./a/b);}double fgcd(double a,double b){return b>eps?fgcd(b,fmod(a,b)):a;}int main(){//freopen("in.in","r",stdin);int T;double ans,l[3],d[3];scanf("%d",&T);while(T--){for(int i=0;i<3;i++)scanf("%lf%lf",&p[i].x,&p[i].y);for(int i=0;i<3;i++)l[i]=dis(p[(i+1)%3],p[(i+2)%3]);ans=2.*PI;for(int i=0;i<3;i++){d[i]=2.*deg(l[(i)%3],l[(i+1)%3],l[(i+2)%3]);ans=fgcd(ans,d[i]);}printf("%d\n",(int)(2.*PI/ans));}return 0;}