HDU 2104

Posted elvis827

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2104相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2104

题目大意:n个人围成一圈玩藏手绢,每个人背后都有box,也就是n个boxes,Haha喜欢从头开始,每隔m-1个人来找,问Haha能否把所有的箱子全部找一遍,找得出则输出YES,找不出则输出POOR Haha

解法:n和m互质即可,互质条件为最大公约数为1,求最大公约数的方法有辗转相除法,相减法,穷举法

 

gcd方法:

辗转相除法:两数n和m,n > m,取n除以m,即n做被除数,m做除数;

      若余数为0,则最大公约数为m;

      若余数不为0,则m做被除数,余数i = n % m 做除数,继续求解,重复执行,直至余数为0,则本次除数和上一次的余数即为最大公约数。

 

相减法:两数n和m,n > m,取n - m;

    若结果为0,则最大公约数为m;

    若结果不为0,则令i = m - n, 取m - i,令m为被减数,i为减数,重复执行,直至余数为0,则本次减数和上一次余数即为最大公约数。

 

穷举法:这个嘛……诶……

    两数n和m,n > m,令m不断减1,找出令n除以m可以整除的最小值

    这名字很好听。

 

scanf和scanf_s也不知道什么鬼……找个时间搞清楚

太久没打了……取地址符&都忘记打了……不能老是打cin,还是打scanf吧

最后小心找不到是输出POOR Haha,不是NO,脑袋不清醒竟然弄了一个小时才发现!!!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    long n, m;
    while (scanf("%d%d", &n, &m) != EOF)
    {
        //辗转相除法
        if (n == -1 && m == -1)
            break;
        int i = n % m;
        if(m == 1){
            printf("YES\n");
            continue;
        }
        if (i != 0)
        {
            while (m % i != 0)
            {
                int k = i;
                i = m % i;
                m = k;
            }
            if (i == 1)
                printf("YES\n");
            else
                printf("POOR Haha\n");
        }
        else
            printf("POOR Haha\n");
    }
    return 0;
}

 

以上是关于HDU 2104的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2104

划分树 poj2104 hdu5249

HDU 2665 && POJ 2104(主席树)

hide handkerchief(hdu2104)

POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

整体二分初探 两类区间第K大问题 poj2104 & hdu5412