题目大意:有一只狼和一只兔子,兔子只能躲在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
5
using namespace std;
6
7
int T,n,m,temp;
8
9
int 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
15
int 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