sgu 106 The equation

难度: 2.5

分析:本题解不定方程 ax + by = c ,求出有多少个整数解满足给定区间范围。首先系数a或b为0时容易求解。

       然后对一般情况,可以简单地逐个试探,但依题意需要试探最多达1亿次,而限时为0.5秒。一般粗略估计,100万次简单循环大约需要10毫秒,一亿次需要1秒。

      由于系数为0的特殊情况是容易的,可以考虑往这个方向转化。但要直接将一个任意系数化成0似乎比较困难,能否间接地达到目标?注意系数为负时可以转化成正的来考虑,因此只要考虑系数为正的情况。要将一个正的系数转化成0,可以一点一点减小,直至达到0。如a>=b,那么求解方程(a-b)x+by=c,如果(x0,y0)是这个方程的解,那么(x0,y0-x0)就是原方程的解,反之亦然。这个过程可以重复,到最后便转化成了系数为0的特殊情形。但是依题意系数也能达到1亿,如果a和b相差很大,那么一次减一个b就需要转化很多次。可以看到对于(a-2b)x+by=c的每个解(x,y),原方程有对应的解(x,y-2x),因此可以一次减掉尽量多的b。令r=a%b,那么一次可将原方程化成rx+by=c。

      时间复杂度多少?如果r<b/2,那么一次便将b(即较小的系数)减少一半以上;否则,第二次转化得到的较小系数为b-r,由r>b/2知b-r<b/2。因此至多两次可将b减少一半,因此循环的次数不超过logb。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值