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