Description
在一个山腰上有n个洞,洞从0~n-1编号并围成个圈。一只兔子藏在了其中一个洞里。一只狼逆时针顺序搜索兔子,从第0个洞进入,然后进入后边每m个洞里。例如:m=2,n=6,这只狼就要分别进第0 2 4 0个洞。如果兔子藏在1或3或5号洞里它就可以存活下来,我们称这些洞是安全的。
Input
第一行一个P,P表示测试用例的数目
下边跟着P行,每行有2个正整数m和n(0<m,n<2147483648).
Output
对于每对m,n输出一行,如果有洞是安全的,输出“YES”,否则输出“NO”。
Sample Input
2
1 2
2 2
Sample Output
NO
YES
假设有n=6个洞 0 1 2 3 4 5
当m=4时,狼进的洞是0 4 2 0,也就是形成了一个循环,永远也到不了其他洞穴
当m=5时,狼进的洞是0 5 4 3 2 1 0,这时所有的洞都遍历了一遍
当m=4和m=5时,到底有什么区别?
当n和m有公约数(非1)时,就会形成一个数字个数小于n的循环
当n和m无公约数时,就会形成一个数字个数为n的循环,此时没有安全洞穴
题就转化成了判断两个数是否有公约数
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
int t;
cin >> t;
while(t--)
{
int m, n;
cin >> m >> n;
if(gcd(m, n) == 1)
cout << "NO" << '\n';
else
cout << "YES" << '\n';
}
return 0;
}