裴蜀定理
在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理,裴蜀定理得名于法国数学家艾蒂安·裴蜀。 ——引自百度百科
具体内容:
若 a , b 是整数,且 gcd ( a , b ) = d ,那么对于任意的整数 x , y , ax + by 都一定是 d 的倍数,特别地,一定存在整数 x , y 使 a x + b y = d 成立。
简单来说,我们设 d = gcd ( a , b ) ,那么对于方程 a x + b y = d ,一定存在一组整数解。并且对于方程 a x + b y = z ,如果满足 d|z,那么方程一定有整数解,否则无整数解。
举个例子:
# 【模板】裴蜀定理(洛谷P4549)
## 题目描述
,使得 S>0S>0 且 SS 尽可能的小。
给定一个包含 $n$ 个元素的**整数**序列 $A$,记作 $A_1,A_2,A_3,...,A_n$。
求另一个包含 $n$ 个元素的待定**整数**序列 $X$,记 $S=\sum\limits_{i=1}^nA_i\times X_i$,使得 $S>0$ 且 $S$ 尽可能的小。
## 输入格式
第一行一个整数 $n$,表示序列元素个数。
第二行 $n$ 个整数,表示序列 $A$。
## 输出格式
一行一个整数,表示 $S>0$ 的前提下 $S$ 的最小值。
## 样例 #1
### 样例输入 #1
```
2
4059 -1782
```
### 样例输出 #1
99
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gcd(int x, int y) {
return y ? gcd(y, x%y) : x;
}
int n;
int main() {
scanf("%d", &n);
int ans = 0, tmp;
for(int i=1; i<=n; i++) {
scanf("%d", &tmp);
if(tmp < 0) tmp = -tmp;
ans = gcd(ans, tmp);
}
printf("%d", ans);
}