当前位置 : 主页 > 编程语言 > c语言 >

2018 UESTC Training for math H

来源:互联网 收集:自由互联 发布时间:2023-09-07
Ευκλειδης 原题地址 1. 题意:给定三个点,求可以构成的最小正n边形的边数。 2. 思路分析: 先把距离以及角度的函数写出,方便以后处理; 由余弦定理可以求出这三条边对应的角

Ευκλειδης
原题地址
1. 题意:给定三个点,求可以构成的最小正n边形的边数。
2. 思路分析:

先把距离以及角度的函数写出,方便以后处理;

由余弦定理可以求出这三条边对应的角度。对于正 n 边形,每个圆心角为 1/n 2 pi,当我们用每条边对应的圆心角/3~1000内的多边形的圆心角,如果可以整除,那么就是最小的边数。注意:我们求的角度是圆周角=圆心角/2.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define maxn 200005
const int mod=1e9+7;
#define eps 1e-6
#define pi acos(-1.0)

bool zero(double n){
    return n<eps&&n>-eps;
}
double dis (double x1,double y1,double x2,double y2){
    return sqrt( (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
double ang(double a,double b,double c){
    return acos( (a*a+b*b-c*c)/(2*a*b) );
}
bool check (double n){
    return zero(n-(int)(n+0.5));
}

ll quipow(ll a,ll b){
    ll ans=0;
    while(b>0){
        if(b%2)ans=ans*a;
        b=b/2;
        a=a*a;
    }
    return ans;
}

int main(){
    double x[3],y[3],a,b,c,A,B,C;
    int i,j;
    for(i=0;i<3;i++){
       cin>>x[i]>>y[i];     
    }
    a=dis(x[0],y[0],x[1],y[1]);
    b=dis(x[0],y[0],x[2],y[2]);
    c=dis(x[1],y[1],x[2],y[2]);

    A=ang(a,b,c)/pi;
    B=ang(b,c,a)/pi;
    C=ang(c,a,b)/pi;
    for(i=3;i<=2000;i++){
        if(check(A*i)&&check(B*i)&&check(C*i))break;
    }
    cout<<i<<endl;
}




【本文来自:台湾服务器 http://www.558idc.com/tw.html 复制请保留原URL】
上一篇:UESTC Training For Summer Selection A
下一篇:没有了
网友评论