题目链接:http://codeforces.com/contest/1096/problem/C
题目大意:T是测试样例,然后每一次输入一个角度,然后问你在一个n边形里面,能不能构成这个角度,如果能,输出边数,如果没有就输出-1.
具体思路:利用一个性质,四边形内的每个点都能被这个四边形内的最小的角度表示出来,也就是倍数关系。
然后我们打表就可以发现,最多是到179度多,这个时候的边数是360条边,这样的话,我们就直接打表,从3-360条边打表,然后循环就可以了。
AC代码:
#include <bits/stdc++.h>
using namespace std;
# define ll long long
# define mod 998244353
const int maxn = 200+100;
struct node
{
double minn;
double maxx;
} q[maxn];
int main()
{
int T;
for(int i=3; i<=360; i++)
{
q[i].maxx=180.0-360.0/(i*1.0);
q[i].minn=q[i].maxx/((i-2)*1.0);
// cout<<i<<" "<<q[i].maxx<<" "<<q[i].minn<<endl;
}
scanf("%d",&T);
while(T--)
{
int ans=0;
double tmp;
scanf("%lf",&tmp);
for(int i=2; i<=360; i++)
{
if(q[i].minn<=tmp&&q[i].maxx>=tmp)
{
int t=tmp/q[i].minn;
// cout<<i<<" "<<t<<endl;
if(fabs(t-tmp/q[i].minn)<=1e-6)
{
ans=i;
break;
}
}
}
printf("%d\n",ans);
}
return 0;
}