HDU 1222 Wolf and Rabbit (擴充套件歐幾里德應用)

_TCgogogo_發表於2015-08-28


Wolf and Rabbit

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 6292    Accepted Submission(s): 3142

Problem Description
There is a hill with n holes around. The holes are signed from 0 to n-1.



A rabbit must hide in one of the holes. A wolf searches the rabbit in anticlockwise order. The first hole he get into is the one signed with 0. Then he will get into the hole every m holes. For example, m=2 and n=6, the wolf will get into the holes which are signed 0,2,4,0. If the rabbit hides in the hole which signed 1,3 or 5, she will survive. So we call these holes the safe holes.

Input
The input starts with a positive integer P which indicates the number of test cases. Then on the following P lines,each line consists 2 positive integer m and n(0<m,n<2147483648).
 
Output
For each input m n, if safe holes exist, you should output "YES", else output "NO" in a single line.

Sample Input
2 1 2 2 2

Sample Output
NO YES
 
Source
杭州電子科技大學第三屆程式設計大賽

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1222

題目大意:n個數0 ~ n-1,現在從0開始每次可到距離自己逆時針方向m個數的地方,問是否有數字能不被訪問到

題目分析:題是水題,yy一下就能出來,gcd(n, m) == 1時都能被訪問到,下面給出證明:
顯然走了a次m步所到的位置為pos = am % n = am - (am / n) * n,令am / n = -b,可以得到pos = am + bn (b < 0,0 <= pos < n),根據擴充套件歐幾里德演算法我們知道對於不定方程am + bn = gcd(n, m) = pos一定有解,因此只要是gcd(n, m)的倍數的數都能被訪問到,所以當gcd(n, m) = 1時,pos可以為0 ~ n - 1的任意一個


#include <cstdio>

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

int main()
{
    int T, n, m;
    scanf("%d", &T);

    while(T--)
    {
        scanf("%d %d", &n, &m);
        printf("%s\n", gcd(n, m) == 1 ? "NO" : "YES");
    }
}


 

相關文章