hdu1222:gcd的应用

                                                                              G - Wolf and Rabbit

There is a hill with n holes around. The holes are signed from 0 to n-1. 



A rabbit must hide in one of the holes. A wolf searches the rabbit in anticlockwise order. The first hole he get into is the one signed with 0. Then he will get into the hole every m holes. For example, m=2 and n=6, the wolf will get into the holes which are signed 0,2,4,0. If the rabbit hides in the hole which signed 1,3 or 5, she will survive. So we call these holes the safe holes. 

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

2
1 2
2 2

Sample Output

NO
YES

思路,开始的时候我考虑了分情况的模运算:

扫描二维码关注公众号,回复: 2256192 查看本文章

1.如果m=1,肯定是NO;

2.如果n%m=0,肯定是YES;

3.如果n%m!=0,肯定是NO;

代码如下:

#include<stdio.h>
int main()
{
	int n,a,b,i;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&a,&b);
		if(a==1)	
		{
			printf("NO\n");
			continue;
		}
		if(b%a==0||a%b==0)
			printf("YES\n");
		if(b%a!=0||a%b!=0)
			printf("NO\n");
	}
	return 0;
}

但是很不幸,我wa了。原来我少考虑了一种情况,比如6和4模运算不等于零,应该输出NO,但实际上是YES。

后来知道了,这题就是求两数互质的。为什么呢?如果假设狼不能够走完每个洞,那么只可能是它一直在那几个固定的洞兜圈子。也就是说他走了几圈之后又回到了原点,并不断循环下去。还拿6和4举例子,我们知道n和m的最小公倍数=n*m/最大公约数,那么6和4的最小公约数=12.也就是说每走12步,狼就转了一圈,回到原点。只有当最大公约数为1,也就是两数互质时,狼能够走完每个洞。

AC代码如下:

#include<stdio.h>
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
	int n,a,b,i;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&a,&b);
		if(gcd(a,b)==1)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}

如果关于gcd和lcm不懂的,可以看我的另一篇博客,专门介绍了最大公约数和最小公倍数。

猜你喜欢

转载自blog.csdn.net/doubleguy/article/details/81114474