gcd

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

#define ll long long
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
View Code

 

拓展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;
}
View Code

 

 裴蜀定理

由拓展gcd可得 , a*x + b*y = c有解的充要条件是c为gcd(a,b)的整数倍

定理推广:

ax + by + cz + ···+nm = f 的充要条件是f 为gcd(a,b,c,...,m)的整数倍

posted @ 2019-08-07 00:13  Obliviate  阅读(135)  评论(0)    收藏  举报