http://acm.hdu.edu.cn/showproblem.php?pid=1222
将环转换成首尾相接无限延长的直线...........1,2,3,4........n , 1, 2, 3, 4,.....n ,1, 2, 3 , 4,..........
如果需要找到兔子,就以为着需要遍历所有的山洞,而且每一次所到达的山洞的位置,不能是相同的,否则,就会产生“死”循环。
假设 跳跃的距离为X,山洞长度为N, 那么X Mod N 有一个数值N1(就是山洞编号),2*X Mod N为N2 ,3*X Mod N 为 N3.。。。。。直到k* x %N 为N(n -1 )...就是取余后每一个位置都有唯一的数值。
现在我们假设在 1 ~ N 个山洞中间存在 I * X 和 j * X Mod N 处于相同的位置,那么就有 I * X Mod N == j * X Mod N ; 即 ( i - j )* X % N == 0 ;变形得 ( i - j ) * x == k * N ; 现在要求X 与N 互质 ,那么N (假设为组合数)== P1 * P2 * P3.....PN ( P 为质因子 ),则 N 的质因子一定在 i - j 中找到, 就是说 N是(i - j ) 的因子 ;又因为 I 和 j 都属于1 ~ N , 所以与架设矛盾 , 因此 ,无法找到满足 ( i - j ) 能整除 N 的 i 和 j ,所以,只需要 X 和 N 互质即可
#include<iostream>
#include<cstdio>
using namespace std;
int gcd( int a , int b )
{
return b == 0 ? a : gcd( b , a % b ) ;
}
int main()
{
int Case , m , n ;
cin >> Case ;
while( Case-- )
{
cin >> m >> n ;
if( gcd( m , n ) == 1 )
cout << "NO" <<endl ;
else
cout << "YES" << endl ;
}
return 0 ;
}