题目大意:
题目链接:https://www.luogu.org/problem/P4549
给出
n
n
n个数
(
A
1
.
.
.
A
n
)
(A_1...A_n)
(A1...An)现求一组整数序列
(
X
1
.
.
.
X
n
)
(X_1...X_n)
(X1...Xn)使得
S
=
A
1
X
1
+
.
.
.
A
n
X
n
>
0
S=A_1X_1+...A_nX_n>0
S=A1X1+...AnXn>0,且
S
S
S的值最小。
思路:
裴蜀定理:对整数
a
,
b
a, b
a,b和它们得的最大公约数
d
d
d,对于任意整数
x
,
y
x,y
x,y,必然有
d
∣
a
x
+
b
y
d|ax+by
d∣ax+by。
所以我们设
a
x
+
b
y
=
d
k
,
k
∈
Z
∗
ax+by=dk,k\in\Z^*
ax+by=dk,k∈Z∗,那么我们就把这个方程减少了一项。
那么利用进行
n
−
1
n-1
n−1次裴蜀定理后,我们就把方程变成了
S
=
a
x
S=ax
S=ax的形式。那么此时显然
x
=
1
x=1
x=1时有
S
=
a
S=a
S=a是最小的。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a,b;
int main()
{
scanf("%d%d",&n,&a);
for (int i=1;i<n;i++)
{
scanf("%d",&b);
a=__gcd(abs(a),abs(b));
}
printf("%d\n",a);
return 0;
}