1、如何求解二元一次不定方程的整数解这里讨论的二元一次不定方程专指 ax+by=c(a*b0,a,b,cZ)-定理一:方程有整数解的充分必要条件是(a,b)|c(a,b)即 Gcd(a,b),下同)定理二(裴蜀定理)设(a,b)=1,则方程的全部整数解可表为:x=x0+bt,y=y0-at(x0,y0 是方程的一组整数解,t 为任意整数)也可以表述为:方程的全部整数解可表为:x=x0+bt/(a,b),y=y0-at/(a,b)(x0,y0 是方程的一组整数解,t 为任意整数)我以前的一个想法是求出(a,b)并判断是否(a,b)|c,然后约简 a,b,c(都除以(a,b),这样(a,b)=1,如果
2、方程有整数解的话,根据定理二,在一个长度为|b|的整数范围内必存在一个x 的解,在一个长度为|a|的整数范围内必存在一个 y 的解。那么在 x 的0,|b|-1或者 y 的0,|a|-1上试解吧,找到 x0 可以求出 y0,找到 y0 可以求出 x0。为了减少搜索次数,我们先比较|a|和|b|,如果|a|b|就在 y 上试解,反之则在 x 上试解。我用这种办法 ac 了sgu106 和 poj1061,但是这种办法的代价并非是最低的,因为有一个著名的欧几里德扩展算法。这个算法源自于求 gcd 的欧几里德算法,二者的算法复杂度基本上是一样的。回忆一下欧几里德算法:有两个数 a,b,我们把它们写成
3、 u0 和 u1,求 gcd 的步骤如下:u0=q0*u1+u2u1=q1*u2+u3u2=q2*u3+u4.uj=qj*u(j+1)u(j+1)便是 a 和 b 的最大公约数。要求出一组整数解,可以先求出 ax+by=(a,b)的一组解 x0,y0,然后 x0=x0*c/(a,b),y0=x0*c/(a,b).同样地,把 a 和 b 写成 u0 和 u1,设 ui=u0*xi+u1*yi(必然存在这样的 xi 和 yi,因为 uj 是gcd(u0,u1)的倍数),那么 x0=1,y0=0,x1=0,y1=1;u(i+1)=u(i-1)-q(i-1)*ui=u0*x(i-1)+u1*y(i-1)-q(i-1)*u0*x(i)-q(i-1)*u1*y(i)=u0*(x(i-1)-q(i-1)*x(i)+u1*(y(i-1)-q(i-1)*y(i),而 u(i+1)=u0*x(i+1)+u1*y(i+1),因此x(i+1)=x(i-1)-q(i-1)*x(i)y(i+1)=y(i-1)-q(i-1)*y(i)伟大的递推式!我们要求的是 xj 和 yj(uj=u0*xj+u1*yj,uj 为 gcd),所以只要递推到 xj 和 yj 即可。