杭电1024

杭电1024

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
 
 
 
题目大意:就是有n个人,每个人背后有个盒子,有个人的盒子中有一块手帕,然后haha要在所有人中找到这块手帕,但是他有一个怪癖,他会从目前的盒子开始,下一个找的是隔着 m-1个盒子的那个盒子。比如A,B,C,则n=3,假设m=2,假如他开始在A盒子那边,则他下一个找的就是隔着m-1=1个盒子的C,下一个找B。问是否haha能遍历全部人。
 
解题思路:判断n和m是否互质
 
方法:辗转相除法 
while(m!=0){//小数不等于0
            temp=m;    //小数存起来
            m=n%m;      //小数=大数%小数
            n=temp;       //大数=小数
            //最后的n就是最大公约数
        }

证明就不证明了,是高斯大大发明的

判断条件:

if(n==1){//最大公约数为1 表示互质 能遍历完
            cout<<"YES"<<endl;
        }else{//不是1 就不行
            cout<<"POOR Haha"<<endl;
        }

ac代码:

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
using namespace std;

int main()
{
   int n,m,temp;
   while(cin>>n>>m){
    if(m==-1&&n==-1){
        break;

    }
    else{
        while(m!=0){//小数不等于0
            temp=m;    //小数存起来
            m=n%m;      //小数=大数%小数
            n=temp;       //大数=小数
        }
        if(n==1){
            cout<<"YES"<<endl;
        }else{
            cout<<"POOR Haha"<<endl;
        }
    }
   }

    return 0;
}

总结 :多少知道了辗转相除法,然后就是感觉English有点难懂。