P4549 【模板】裴蜀定理


题目传送门

裴蜀定理(贝祖定理)

定理
\(ax+by=c,x∈Z^+,y∈Z^+\)成立的充要条件\(gcd(a,b)|c\)

证明

  • 充分性
    \(s=gcd(a,b)\),显然\(s|a\),并且\(s|b\)
    因为\(x,y∈Z^+\)
    所以\(s|ax,s|by\)
    显然要使得之前的式子成立,则必须满足\(c\)\(a\)\(b\)的公约数的倍数。

  • 必要性
    又因为\(x\)\(y\)是正整数
    所以\(c\)必然是\(a,b\)最大公约数的倍数。

因此,证得该定理成立

说明
该定理完全可以推广到若干数的线性组合

#include 
using namespace std;

//最大公约数,辗转相除法
int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

int main() {
    int n;
    scanf("%d", &n);
    int d = 0, a;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a);
        d = gcd(d, abs(a)); //负数没法求最大公约数,这里认为系数都是正数,让变量x,y吃进去这个负号
    }
    printf("%d", d);
    return 0;
}