专栏文章

题解:P4549 【模板】裴蜀定理

P4549题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@mip6pq4a
此快照首次捕获于
2025/12/03 07:03
3 个月前
此快照最后确认于
2025/12/03 07:03
3 个月前
查看原文

P4549 【模板】裴蜀定理 题解

预备知识

Bézout 定理: 对于任意的 a,b (a,bZ)a, b\ (a,b\in \Z),都有相对应的 x,y (x,yZ)x, y\ (x,y\in \Z) 使得 ax+by=gcd(a,b)ax + by = \gcd(a, b)

证明:

考虑分类讨论。
在最后辗转相除到 b=0b = 0 时,可以使 x=1x = 1y=0y = 0,使得 a×1+0×0=gcd(a,0)a\times 1 + 0\times 0 = \gcd(a, 0)
b>0b > 0,先假设存在 x,y (x,yZ)x, y\ (x,y\in \Z),满足 bx+y(amodb)=gcd(b,amodb)bx + y(a\bmod b) = \gcd(b,a\bmod b)
因为 bx+y(amodb)=bx+y(aba÷b)=ay+b(xya÷b)bx + y(a\bmod b) = bx + y(a - b\lfloor a\div b\rfloor) = ay + b(x - y\lfloor a\div b\rfloor),所以我们令 x=yx' = yy=xya÷by' =x-y\lfloor a\div b\rfloor,即可知 ax+by=gcd(a,b)ax' + by' = \gcd(a,b)
使用归纳法即可证明。

延伸定理

根据 gcd(a,b,c)=gcd(a,gcd(b,c))\gcd(a, b, c) = \gcd(a, \gcd(b, c)) 和刚刚证明的过程,可得
a1x1+a2x2++anxn=gcd(a1,a2,,an)(a,xZ)i=1nai×xi=gcd(a1,a2,,an)a_1 x_1 + a_2 x_2 + \cdots + a_n x_n = \gcd(a_1, a_2, \dots,a_n) \\ (a, x\in \Z) \\ \text{即}\sum\limits_{i=1}^na_i\times x_i = \gcd(a_1, a_2, \dots,a_n)
一般说该定理为 Bézout 定理的扩展定理。

题目分析

题目记 S=i=1nAi×XiS=\sum\limits_{i=1}^nA_i\times X_i,根据 Bézout 定理的扩展定理可知 S=kgcd(A1,A2,,Ai) (kZ)S = k\gcd(A_1, A_2, \cdots,A_i)\ (k\in \Z) (易知 kk 不影响等式成立)。明显地,k=1k = 1 时可以存在 S>0S > 0 且取到最小值。所以,我们需要求的是 gcd(A1,A2,,Ai)\gcd(A_1, A_2, \cdots,A_i)
其实本题中 AiA_i 等价于 Ai-A_i,因为可以更改系数 XiX_i 的正负,故我们计算时取 AiA_i 的绝对值。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
int n,ans;
signed main(void){
    scanf("%d",&n);
    n--;
    scanf("%d",&ans);
    ans=abs(ans);
    while(n--){
        int x;
        scanf("%d",&x);
        ans=__gcd(ans,abs(x));
    }printf("%d\n",ans);
    return 0;
}
感谢大家的浏览,希望得到大家的认可与支持。
Update250604:修改几处笔误。

评论

2 条评论,欢迎与作者交流。

正在加载评论...