HDU 1792 推论 大东软(万岁)平安夜组合同理

8 篇文章 0 订阅

这个题就是说给我们两个价值,然后不限我们每个价值的数量。求最大的的一个不能被am+bn表示的数。


复杂的公式推导我觉得大家都不想去看,我们直接用传统的方法让大家理解。希望大家认真看下去,可能有的人会觉得简单,但是想看的就看看哈。


我们只推导m和n互素的情况下,为什么最大不能被组合的数是(m-1)n-m;

对于他们不互素的情况,只是扩展欧几里得的一个应用,其他的很多人都有推论。


我们针对m来说明说明这个问题,如果我们得到的数M全是m的倍数,那么这个数肯定能够得到。此时我们就不需要n而已(a*m+0*n);

也就是M%m=0的情况。

有人就会问了,那么M%m=1呢?,那么M%m=2呢?…………


后面的请直接看表

当m=3,n=5的时候的情况例举

枚举前26个数来说明。

余数








0 03691215182124
1147101316192225
2258111417202326

我们针对m就可以把所有的数字按余数不同分成3类:0,1,,2

对于第一行,那么看到了什么呢?是不是都能表示?,就是我们所说的那种都是用m来表示的。不需要n

对于第二和第三行,有没有能被表示出来的呢?首先第二行都不是m的倍数,那么我们就需要找到一个n的倍数的数,在n的倍数那个数之后的所有数都能被表示出来,因为我们这里是有循环的,是m一循环,所以得到的数字就可以这样表示:xn+a*m;

为什么n的倍数会出现在其他的行中呢?其实很简单,就是因为他们两个数互素的,(c*n)%m{c<m}就能得到m的所有余数。所以他会出现在其他行的每一列。


试着去理解一下,我尽量写的很直白了,但是太多字咯,抱歉。


现在我们就只需要去找最小的n的倍数,他也就是在该行中最小的能被表示的数字。他前面的那个也就是不能表示的该行最大的数。怎么找呢?就是:n的倍数-m。因为是m一循环。


现在我们是不是需要找到一个最大的n的倍数,然后他的前一个也就是最大的不能表示的数。最大的n的倍数就是(m-1)*n,我如果取m*n的情况的话,就和0*m的情况在同一列。所以,最大的找到了,在他前面就是(m-1)*n-m;


好咯,感谢你耐心听我废话。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值