Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1. |
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 21 22 2 |
Sample Output NOYES |
1 #include2 //get the greatest common divisor 3 int gcd(int a, int b) 4 { 5 int r; 6 while (b) 7 { 8 r = a % b; 9 a = b;10 b = r;11 }12 return a;13 }14 int main()15 {16 int N, m, n;17 scanf("%d", &N);18 while(N--)19 {20 scanf("%d %d", &n, &m);21 if(gcd(n, m) == 1)22 printf("NO\n");23 else24 printf("YES\n");25 }26 return 0;27 }
The reason why we can judge by greatest common divisor(gcd):
Condition:
firstly, r is the gcd of a, b and a is bigger than b, t is the lowest common multiple(lcm) of a, b
then you can get
r = gcd(a, b)
t = a * b / r
secondly, the wolf find the t hold, the wolf will stop, because it's will be circulatory.
-------------------------
Question
the question is to find 0 < x < t / a and 0 < y < t / b to satisfy the equality
ax + r = by
for the equality, you will find (by - ax) / r is a integer, so you can find x, y making (by - ax) / r = 1
------------------------
Conclusion
"ax + r = by" means the r hole will be found, in other words, the gcd will be found.
so, if gcd is equal to 1, it means all holes will be found. if gcd is equal to other number, it means there are safe holes.