大水题,判断输入的a,b最大公约数是否为1
若不为1,则必然存在一个循环使得无法遍历所有的洞
若为1,则必然可以遍历所有的洞
有m个洞,狼每次跨越n个洞检查
则遍历洞的个数即为m/gcd(m,n)
看了好多人的代码,发现几乎没有人证明这个结论的正确性...这也太不严谨了吧
证明如下:
可知前k+1次搜索的洞的序号为:0, n%m, 2*n%m, 3*n%m, 4*n%m...k*n%m
不妨设n<m(即使n>m,也可以令n=n%m)
则遍历序号可以写作:0, n, 2*n-t2*m, 3*n-t3*m, 4*n-t4*m ... k*n-tk*m
因为n,m的gcd不等于1时,则lcm(m,n)必然小于m*n,则可想而知必然存在一个ti使得对于某个i有i*n==ti*m
此时的i*n即为lcm(m,n)小于m*n,则i<m,所以未遍历完m个洞!
代码如下:
#include <stdio.h>
int gcd(int a, int b) {
return b==0 ? a : gcd(b, a%b);
}
int p, a, b;
int main(void) {
scanf("%d", &p);
while(p--) {
scanf("%d %d", &a, &b);
if(gcd(a, b) == 1)
printf("NO\n");
else printf("YES\n");
}
return 0;
}