POJ 2891 Strange Way to Express Integers

22 篇文章 0 订阅

告诉你k对a,b,x=ai mod bi,求满足条件最小的非负x,如果无解,输出-1

 

参考:http://scturtle.is-programmer.com/posts/19363.html

http://hi.baidu.com/edwardmj/blog/item/a1cd568087ad4cb26d81197c.html

 

 

由于bi,bj不保证互素,不能用直接套中国剩余定理,做法是利用欧几里德扩展定理,将两个等式合并,然后再与其他的等式一一合并

 

对于x=a1 mod b1,x= a2 mod b2,设x=a1+m*b1

所以b1*m=a2-a1 mod b2,利用欧几里德扩展定理求出最小的非负m,那么x=a1+m*b1就已知,且x最小,如果无解,整个同余式组无解

 

同时,x+k*b1是所有满足x=a1 mod b1的解,而x+k'*b2又是所有满足x=a2 mod b2的解

那么,将x+k*b1与x+k'*b2合并,得到的式子就是x+k*lcm(b1,b2)

于是,上面两个式子可以用x'=x mod lcm(b1,b2)来替代

最后,就只剩下一个式子了,求得的最小的x就是答案

 

对于一次同余式ax=b mod n,设d=gcd(a,n),则同余式有解的充要条件为d|b

假设d=a*x'+n*y',则x0=b/d*x'一定为方程组的一个解,且共有d个解,(证明可以参考算法导论)最小正整数解为(x0%n/d+n/d)%(n/d)

 

代码:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值