题目大意:有一只狼和一只兔子,兔子只能躲在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这个洞又重新开始循环,所以,绝对存在一个洞没有被狼访问过。
1#include <iostream>
2#include <cstdio>
3#include <cstring>
4
5using namespace std;
6
7int T,n,m,temp;
8
9int gcd(int x,int y)
10{ if (!x || !y) return x>y?x:y;
11 for (int t; t=x%y; x=y, y=t);
12 return y;
13}
14
15int main()
16{ cin >> T;
17 while (T--)
18 { cin >> m >> n;
19 temp=gcd(m,n);
20 if (temp==1) cout << "NO" << endl;
21 else cout << "YES" << endl;
22 }
23 return 0;
24}
25