模板 基础数论
辗转相除法:求(a,b)的做法,原理:(a,b)=(b,a%b),当右项为0时,左项即为最大公约数。
代码:
typedef long long int64;
int64 gcd(int64 a, int64 b){
return (b == 0)? a: gcd(b, a % b);
}扩展欧几里得算法:对于方程ax+by=gcd(a,b),求x,y最小值。
代码:
typedef long long int64;
int64 gcd_ex(int64 a,int64 b,int64& x,int64&y)
{
<span style="white-space:pre"> </span>if (b==0) {x=1;y=0;return a;}
<span style="white-space:pre"> </span>int64 d = gcd_ex(b,a%b,y,x);
<span style="white-space:pre"> </span>y=y-a/b*x;
<span style="white-space:pre"> </span>return d;
}原理:
对于a*x+b*y=d;
递归调用时
令a=b;b=a%b;
将其变为形式2) b*x+a%b*y=d;
变形:b*x+a*y-(a/b)*b*y=d;
再变:a*y+b(x-a/b*y)=d; 3)
与2)式比较:b*x+a%b*y=d; 2)
得:
当a=b;b=a%b时:x=y;y=x-a/b*y;
调用过程中的x,y就是对应的a,b的解;
浙公网安备 33010602011771号