BestCoder Round #79 (div.2)-jrMz and angles,,暴力求解~

                                   jrMz and angle

 
 
    Time Limit: 2000/1000 MS (Java/Others)
           
 Memory Limit: 65536/65536 K (Java/Others)

问题描述
jrMz有两种角,第一种角都是正nn边形的内角,第二种角都是正mm边形的内角。jrMz想选出其中一些,某种角可以选多个或一个都不选,使得选出的所有角的度数之和恰好为360度。jrMz想知道这是否可能实现。
输入描述
有多组测试数据,第一行一个整数\left(1\leq T\leq10\right)(1T10),表示测试数据的组数。
对于每组测试数据,仅一行,两个整数n,m\left(3\leq n,m\leq100\right)n,m(3n,m100),之间有一个空格隔开。
输出描述
对于每组测试数据,仅一行,一个字符串,若可能实现则为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(n>=3)边形内角和为 180*(n-2),每个内角的角度就可以表示出来,然后两层循环遍历;

          

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int N=1000000+10;
int a[N];
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        int x1=180-360/n;
        int x2=180-360/m;//正m边形的内角;
        int f=0;
        for(int i=0;; i++)
        {
            if(f||i*x1>360)
                break;
            for(int j=0;; j++)
            {
                if(i*x1+j*x2==360)
                {
                    f=1;
                    break;
                }
                if(j*x2>360)
                    break;//限制条件,这样没有搜下去的必要了;
            }
        }
        if(f)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
  

              不过题解好像要更简单一点: 

 

不妨令n\leq mnm

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

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

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

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

转载于:https://www.cnblogs.com/nyist-TC-LYQ/p/7208276.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值