Problem 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 |
Source
HDU 2007-6 Programming Contest
|
Recommend
xhd
|
这一题刚开始自己也是绕了个好大的弯子,最后也是看别人的代码才知道怎么搞的,其实关键就是理解题意,即求M、N的公约数的。当M、N不存在除1以外的公约数时,就无法遍历这些数组,即无法找到手帕;求最大公约数使用到了辗转相除法,
这是我的代码:
#include<iostream>
using namespace std;
int main(void)
{
int n,m,r;
while(cin>>n>>m,(n!=-1||m!=-1))
{
while(n%m!=0)//辗转相除
{
r=n%m;
n=m;
m=r;
}
if(m==1)
cout<<"YES"<<endl;
else
cout<<"POOR Haha"<<endl;
}
return 0;
}
但是这题里面有我不理解的地方,就是输出的时候,不知道为什么当失败的时候,输出格式必须为:printf(“POOR Haha\n”);而不是直接输出Haha呢?