Description
给出n个数(A1…An)现求一组整数序列(X1…Xn)使得S=A1 * X1+…An * Xn>0,且S的值最小
Solution
裴蜀定理:
对于形如
a
x
+
b
y
=
c
ax+by=c
ax+by=c这样a、b、c都为正整数的不定方程,有解的条件是
g
c
d
(
a
,
b
)
∣
c
gcd(a,b)|c
gcd(a,b)∣c
即当
c
=
g
c
d
(
a
,
b
)
c=gcd(a,b)
c=gcd(a,b)时取得最小正整数
本题我们可以两两合并,最后得到
S
=
k
⋅
g
c
d
(
a
1
,
a
2
.
.
.
a
n
)
(
k
∈
Z
)
S=k\cdot gcd(a_1,a_2...a_n) \left(k\in Z\right)
S=k⋅gcd(a1,a2...an)(k∈Z)
显然k取1的时候最小
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
int gcd(int x,int y) {
return !y?x:gcd(y,x%y);
}
int main(void) {
int n,x; scanf("%d",&n);
scanf("%d",&x); int GCD=x;
rep(i,2,n) {
scanf("%d",&x);
GCD=gcd(x,GCD);
}
printf("%d\n", abs(GCD));
return 0;
}