辗转相除法求最大公约数(gcd)


#define ll long long ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); } 拓展gcd
gcd(a,b) = d
求绝对值和最小的x,y,使得a*x + b*y = d
由②可得,
由①,③可得
x1 = y2
y1 = x2 - (a/b)*y2


void exgcd(ll a,ll b,ll &x,ll &y,ll &ans){ if(b==0){ ans = a; x = 1; y = 0; return ; } exgcd(b,a%b,y,x,ans); y += (a/b)*x; return; } 由拓展gcd可得 , a*x + b*y = c有解的充要条件是c为gcd(a,b)的整数倍
定理推广:
ax + by + cz + ・・・+nm = f 的充要条件是f 为gcd(a,b,c,...,m)的整数倍