hdu1222 - Wolf and Rabbit(数学:大水题)

大水题,判断输入的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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值