辗转相除法求最大公约数(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
gcd(a,b) = d gcd(b,a%b) = d
x1*a + y1*b = d ①
x2*b + y2*(a - (a/b)*b) = d ②
由②可得,
y2*a + (x2 - (a/b)*y2)*b = 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)的整数倍
原文:https://www.cnblogs.com/ljinggg/p/11311844.html