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;
}