解不定方程(从HDU1356说起)

本文探讨了解不定方程ax+by=d的方法,重点在于如何找到使|x|+|y|最小的正整数解。通过exgcd算法求得通解,并将问题转化为寻找特定条件下方程的最小正整数解。最后给出实现代码。
摘要由CSDN通过智能技术生成

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1356

由题意,就是要解一个不定方程ax+by=d,要求(abs(x)+abs(y))最小。

一.exgcd

先从exgcd说起。由裴蜀定理可知,ax+by=gcd(a,b)必定存在整数解(x,y)。那么有:

ax+by=gcd(a,b)=gcd(b,a%b)=bx'+(a%b)y'				(1.1)

其中等号1,3用到了裴蜀定理,等号2用到了gcd的性质。

由a%b=a-a/b(本文中所有的除法都是整数除法)那么我们把等式最右边变形,可以得到:

ax+by=bx'+ay'-(a/b)y'=ay'+b(x'-(a/b)*y')			(1.2)

于是得到一组解:

x=y'								(1.3)
y=x'-(a/b)*y'							(1.4)

所以可以用递归的方式求解。

最后考虑一下边界条件,当b==0时,从线性同余方程的角度看x=1,y=0显然是一组可行解。

int exgcd(int a,int b,int &x,int &y){
   
	if(!b){
   
		x=1;
		y=0;
		return a;
	}
	int d=exgcd(a,b,x,y);
	swap(x,y);//此时x=y',y=x'
	y-=a/b*x;//考虑x,y的实际情况,也就是 y=x'-(a/b)*y'
	return d;//顺便吧gcd也求出来
}

二.求通解

再考虑这道题,等号右边并不是gcd,而是一个d,因为题目告诉你一定有解,所以gcd一定是d的因子,我们把x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值