POJ 1061 + POJ 2115 (求模线性方程)

求 a*x=b(mod n). 

 

先转化为求 ax+ny=b.

用扩展欧几里德求出 ax+ny=gcd(a,n). 

扩展欧几里德原理:bx+(a%b)y=1   <=>  ay+b(x-[a/b]*y)=1

 

定理:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n)|b.

 

令d=gcd(a,n).

设为x' ,y'为所求 满足ax'+ny'=gcd(a,n).

则原方程有一解x0=x'*(n/d).

 

定理:假设ax=b(mod n) 有解,x0是该方程的任意一个解,则该方程模n恰有d个不同的解,分别为:xi=x0+i*(n/d)   (其中i=1,2,...d-1).

 

证明:令 xi = x0 + i*(n/d)  (mod n);

    由 a*xi (mod n) = a * (x0 + i*(n/d)) (mod n)
                             = (a*x0+a*i*(n/d)) (mod n)
                             = a * x0 (mod n)             (由于 d | a)
                             = b

 

题目求最小正整数解。

 

定理:(转自http://www.cppblog.com/mythit/archive/2009/06/12/87514.html)

设e=x0+n,方程ax=b(mod n)的最小整数解x1=e mod (n/d),最大整数解x2=x1+(d-1)*(n/d)。

 

POJ 1061:

此处必须注意求出了的t=n/d可能为负数。

POJ 2115:

一开始用1<<k 一直WA  ,用1LL才AC,求指教~

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值