二元一次不定方程(Exgcd)(更方便的解法)

扩展欧几里得算法(Exgcd)

裴蜀定理

对于任意一组整数 a,b,存在一组整数 x,y,满足 ax+by=gcd(a,b)

Proof:

考虑数学归纳法。

b=0 时,由于 gcd(a,0)=a,则对于 ax+0y=a 这个不定方程,x=1y 取任意整数。

假设存在一组整数 x,y,满足 bx+(amodb)y=gcd(b,amodb)=gcd(a,b)

那么接下来证明也存在一组整数 x,y 满足 ax+by=gcd(a,b)

bx+(amodb)y=bx+(abab)y=bx+aybaby=ay+b(xaby)

x=y,y=xaby 时满足条件。

那么利用辗转相除法进行递归,总能递归到 b=0 的情况。命题得证。

Exgcd

求关于 x,y 的方程 ax+by=c 的整数解。

d=gcd(a,b),方程有整数解的充要条件是 dc

Proof:

a=k1d,b=k2d

先证必要性: 当方程有解时,方程化为 d(k1x+k2y)=c,可得 dc

再证充分性: 方程 ax+by=d 必定有解,由于 dc,那么两边同乘 cd 也必定有解。

先将方程化简,两边同除以 d。此时 a,b 互质。

注意,为了方便表述,下面提到的方程都是化简后的方程

那么我们可以先利用裴蜀定理求出 ax+by=1 的一组特解 x,y,从而求出原方程的一组特解 x0=cx,y0=cy

考虑如何求出通解。

x 加上一个数,那么 y 就要减去一个数。设这两个数为 Δx,Δy,则有:

a(x+Δx)+b(yΔy)=cax+aΔx+bybΔy=caΔxbΔy=0aΔx=bΔyab=ΔyΔx

由于 a,b 互质,则 ab 为最简整数比,则有 aΔy bΔx

由于 Δx,ΔyZ,则 Δx 最小取到 bΔy 最小取到 a

通解即为:

{x=x0+kby=y0ka(kZ)

代回原方程,可以消掉 kb,ka

接下来考虑,当存在正整数解时,如何求出最小正整数解与正整数解的个数。

x 的通解进行变形,求 x 的最小正整数解 x1

x1modb=(x0+kb)modbx1modb=x0modbx1=(((x01)modb)+b)modb+1

先减一是为了避免 x0moda 一开始就为 0 的情况,从而保证 x1>0

易得,当 x 增大时,y 减小。当 xx1 时,y 取到最大正整数解 y2

同理,求出 y 的最小正整数解 y1,当 yy1 时,x 取到最大正整数解 x2

由通解公式可得,x 每两个整数解之间相差 by 每两个整数解之间相差 a

正整数解的个数即为 x2x1b+1y2y1a+1

Ex.1 【模板】二元一次不定方程 (exgcd)

根据上面的分析,套用公式即可。

ll T,A,B,C,x,y,d,x1,x2,y1,y2,cnt; 

ll GetX(ll Y){return (C-B*Y)/A;}

ll GetY(ll X){return (C-A*X)/B;}

ll Exgcd(ll a,ll b,ll &x,ll &y){
	if(b==0) return x=1,y=0,a;
	ll res=Exgcd(b,a%b,x,y);
	ll z=x;
	x=y;
	y=z-(a/b)*y;
	return res;
}

void Solve(){
	read(A),read(B),read(C);
	d=Exgcd(A,B,x,y);
	if(C%d) return puts("-1"),void();
	A/=d,B/=d,C/=d;
	x*=C,y*=C;
	x1=((x-1)%B+B)%B+1;
	y2=GetY(x1);
	y1=((y-1)%A+A)%A+1;
	x2=GetX(y1);
	cnt=(x2-x1)/B+1;
	if(y2<=0) printf("%lld %lld\n",x1,y1);
	else printf("%lld %lld %lld %lld %lld\n",cnt,x1,y1,x2,y2);
}

Ex.2 [NOIP2012 提高组] 同余方程

对式子进行变形:

ax1(modb)ax+by=1

利用 Exgcd 求解即可。

这是非常常用的变形技巧,也是当 a,b 互质但 b 不是质数时求逆元的方法。

Ex.3 青蛙的约会

设跳跃 k 次后两青蛙相遇,则可列出方程:

x+kny+km(modL)(xy)+k(nm)0(modL)(xy)+k(nm)=pLk(nm)pL=yxkSpL=C

其中 S,L,C 为常数。

k,p 看作未知数,利用 Exgcd 求 k 的最小正整数解即可。

posted @   XP3301_Pipi  阅读(174)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
Title
点击右上角即可分享
微信分享提示