A - hide handkerchief
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
The Children’s Day has passed for some days .Has you remembered something happened at your childhood? I remembered I often played a game called hide handkerchief with my friends.
Now I introduce the game to you. Suppose there are N people played the game ,who sit on the ground forming a circle ,everyone owns a box behind them .Also there is a beautiful handkerchief hid in a box which is one of the boxes .
Then Haha(a friend of mine) is called to find the handkerchief. But he has a strange habit. Each time he will search the next box which is separated by M-1 boxes from the current box. For example, there are three boxes named A,B,C, and now Haha is at place of A. now he decide the M if equal to 2, so he will search A first, then he will search the C box, for C is separated by 2-1 = 1 box B from the current box A . Then he will search the box B ,then he will search the box A.
So after three times he establishes that he can find the beautiful handkerchief. Now I will give you N and M, can you tell me that Haha is able to find the handkerchief or not. If he can, you should tell me "YES", else tell me "POOR Haha".
Input
There will be several test cases; each case input contains two integers N and M, which satisfy the relationship: 1<=M<=100000000 and 3<=N<=100000000. When N=-1 and M=-1 means the end of input case, and you should not process the data.
Output
For each input case, you should only the result that Haha can find the handkerchief or not.
Sample Input
3 2 -1 -1
Sample Output
YES
题目简述:
假设有N个人在玩这个游戏,他们坐在地上围成一个圈,每个人背后都有一个盒子,还有一条漂亮的手帕藏在一个盒子里。
然后,我的一个朋友叫他去找手帕。但他有一个奇怪的习惯。每次他都会搜索下一个由M-1个盒子与当前盒子隔开的盒子。例如,有三个盒子,分别名为A、B、C,现在Haha在A的位置,现在他决定M等于2,所以他先搜索A,然后搜索C盒子,因为C与当前框A之间用2-1=1的B盒子隔开。然后他将搜索盒子B,然后搜索盒子A。
所以三次之后,他确定他能找到漂亮的手帕。现在我给你N和M,你能告诉我哈哈能不能找到手帕。如果他能,你应该告诉我“YES”,否则告诉我“POOR Haha”。
解题思路:
个人认为,题目的本题的基本题意就是在于对于围成圈的N个盒子每次跳过M-1个盒子进行访问,看是否最后能够遍历到每个盒子。本质上是一个求GCD的问题,如果N和M的GCD等于1,那么,经过多少圈之后,这个圈里的每一个盒子都会被遍历到,但是如果最大公约数不是1,那么在第一圈转完之后会出现循环的情况。所本题的本质就是GCD。辗转相除求GCD就好了。
编码:
#include <bits/stdc++.h> using namespace std; int gcd(int a,int b) { if (!b) return a; else return gcd(b, a % b); } int main() { int n, m; while (cin >> n >> m) { if (n == -1 || m == -1) break; else { if (gcd(n, m) == 1) cout << "YES" << endl; else cout << "POOR Haha" << endl; } } return 0; }