传送门: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