BZOJ1441

BZOJ1441: Min

Time Limit: 5 Sec Memory Limit: 64 MB

Description

给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1X1+...AnXn>0,且S的值最小

Input

第一行给出数字N,代表有N个数 下面一行给出N个数

Output

S的最小值

Sample Input

2
4059 -1782

Sample Output

99

题目解析:

裴蜀定理,对于任意两个数a和b以及他们的最大公约数d,都有关于未知数x,y的线性丢番图方程\((ax+by=m)\),所以用gcd求一下他们的最大公约数,因为d一定是最小的m.

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;

int gcd(int a,int b){
	return b == 0 ? a : gcd(b,a%b);
}

int main(){
	int n,a,ans = 0;
	scanf("%d",&n);
	for(int i = 1;i <= n; i++){
		scanf("%d",&a);
		ans = gcd(ans,a);
	}
	printf("%d\n",ans > 0 ? ans : -ans);
	return 0;
}

posted @ 2017-08-14 15:19  Frade~  阅读(104)  评论(0编辑  收藏  举报