题目描述
给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1X1+...AnXn>0,且S的值最小
输入输出格式
输入格式:
第一行给出数字N,代表有N个数 下面一行给出N个数
输出格式:
S的最小值
输入输出样例
输入样例#1:
2
4059 -1782
输出样例#1:
99
题解
标题海星,直接给出正解……
裴蜀(贝祖)定理,就是关于(x, y)的不定方程(ax + by = c)有整数解的充要条件是(gcd(a, b)mid c)。
由此我们发现对于式子(ax+by)的值一定被(gcd(a, b))整除,于是就变成了(k imes gcd(a,b))。由于(gcd(a, b))已知,把它看成常数(a)即可。于是就把两项给合并了。
然后最终就变成了(ax+by)的最小非负值——那当然是(gcd(a, b))了。
就这样递推下去就行了,注意由于读入可能为负,读进来的时候取个绝对值即可(由于系数也反一下是无关的,所以结果是相同的)。
for(int i = 1, t; i <= n; ++i)
{
scanf("%d", &t);
if(t < 0)
t = -t;
ans = gcd(ans, t);
}