Wolf and Rabbit

Wolf and Rabbit
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

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
 

 题意就是找到找到两个数的最小公倍数等不等于两个数相乘就好了
 数据之大,导致我们无法直接快速模拟出答案。那么我们来思考下数学解法。假如第k个位置,灰狼能走到。那么这第k个位置应该满足什么条件?我们应该能联想到这和步长有关,因为所能走到的位置必然是步长的整数倍再对n取余。即xm%n=k。
      这个式子变形下可以得 k=xm-(xm/n)n。这里的‘/’是整除,所以-( xm/n)是一个整数,那么我们用y替换它。所以最终k=xm+yn。
    也就是说如果存在一组整数解(x,y)使得上式成立。那么k这个位置,灰狼就能走到。现在的问题是有没有哪个位置灰狼走不到,也就是无解的情况。
    根据扩展欧几里德定理我们知道GCD(m,n)=xm+yn在m和n不完全为0的时候,存在唯一解(GCD是最大公约数)。那么如果存在t (t为大于0的整数)使得 k=t GCD(m,n)=t(xm+yn)成立,那么必然存在唯一解(tx,ty)。换句话说,就是k必须是GCD(m,n)的倍数才会被灰狼走过。
    假如GCD(m,n)=1,那么1...n全是它的倍数,全会被灰狼走过。如果 GCD(m,n)!=1,那么1...n中必然存在一个不是 GCD(m,n)的倍数,所以存在安全位置。 
 用GCD的写法就是上面那种感觉自己好弱 摘抄别人的题解

#include<cstdio>
__int64 GCD(__int64 a,__int64 b){
	if(a%b==0)
		return b;
	else 
		return GCD(b,a%b);
}//GCD求最大公约数
__int64 LCM(__int64 a,__int64 b){
	return a*b/GCD(a,b);
}//LCM求最小公倍数

int main(){
	int t;
	scanf("%d",&t);
	__int64 m,n;
	while(t--){
		scanf("%I64d %I64d",&m,&n);
		__int64 k=LCM(m,n);
		if(k==m*n)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值