原文出处:http://www.cppblog.com/wyh123/archive/2011/07/29/152058.html
题目大意:有一只狼和一只兔子,兔子只能躲在n个洞(编号0~n-1)中的任意一个洞里,狼则每跑m个洞会进洞看看兔子有没有在里面。
现在给出一个n,m求兔子是否安全。
例如当n=6,m=2时,狼只能够进去0,2,4三个洞,而兔子只要躲在1,3,5这几个洞里就安全了。
解题思路:利用互质和非互互质的性质。
对于狼来说,他能进的洞是(m*i)%n,i是奔跑的次数。
1)n与m互质,(m*i)%n显然可以得到任意的余数,也就是可以进去任意的洞,那么兔子绝对是不安全的。
2)n与m不互质,(m*i)%n,当i=n/gcd(n,m)时,狼回到了0这个洞又重新开始循环,所以,绝对存在一个洞没有被狼访问过。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T,n,m,temp;
int gcd(int x,int y)
{ if (!x || !y) return x>y?x:y;
for (int t; t=x%y; x=y, y=t);
return y;
}
int main()
{ cin >> T;
while (T--)
{ cin >> m >> n;
temp=gcd(m,n);
if (temp==1) cout << "NO" << endl;
else cout << "YES" << endl;
}
return 0;
}