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; }