您的位置:首页 > 其它

【BestCoder Round #79 (div.2)】HDU5660jrMz and angles

2016-04-10 17:28 295 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5660

问题描述
jrMz有两种角,第一种角都是正nn边形的内角,第二种角都是正mm边形的内角。jrMz想选出其中一些,某种角可以选多个或一个都不选,使得选出的所有角的度数之和恰好为360度。jrMz想知道这是否可能实现。


输入描述
有多组测试数据,第一行一个整数\left(1\leq T\leq10\right)(1≤T≤10),表示测试数据的组数。
对于每组测试数据,仅一行,两个整数n,m\left(3\leq n,m\leq100\right)n,m(3≤n,m≤100),之间有一个空格隔开。


输出描述
对于每组测试数据,仅一行,一个字符串,若可能实现则为Yes,若不可能实现则为No。


输入样例
3
4 8
3 10
5 8


输出样例
Yes
Yes
No


Hint
第一组数据中,jrMz可以选择1个第一种角和2个第二种角,因为90+135+135=36090+135+135=360。
第二组数据中,jrMz可以选择6个第一种角,因为6\times60=3606×60=360。
第三组数据中,jrMz无法选出一些度数之和为360度的角。


出题人的分析:

不妨令n\leq mn≤m。

如果n>6n>6,由于所有角都大于120度且小于180度,也就是说,两个角一定不够,而三个角一定过多。因此一定无解;

当n\leq6n≤6时,如果n=3n=3或n=4n=4或n=6n=6,那么显然只需要正nn边形的角就可以了。如果n=5n=5,则已经有一个108度的角。若这种角:不取,则显然仅当m=6m=6时有解;取1个,则还差360-108=252360−108=252(度),但是没有一个正mm边形的内角的度数是252的约数;取2个,则还差360-108\times2=144360−108×2=144(度),这恰好是正10边形的内角,取3个,则还差360-108\times3=36360−108×3=36(度),也不可能满足;取大于3个也显然不可能。

因此得到结论:当nn和mm中至少有一个为3或4或6时,或者当nn和mm中一个等于5另一个等于10时,有解,否则无解,时间复杂度为

O\left(T\right)O(T)。

代码:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
int main()
{
int t;
cin>>t;
while(t--){
cin>>n>>m;
double angle1=180-360/n;
double angle2=180-360/m;
int flag=0;
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
if(fabs(angle1*i+angle2*j-360.0)<=1e-7){ // 还sb的考虑了可能出现;小数的情况;
flag=1;
break;
}
}
if(flag) break;
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: