BZOJ_1441_Min_数学+裴蜀定理

BZOJ_1441_Min_数学+裴蜀定理

Description

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

Input

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

Output

S的最小值

Sample Input

2
4059 -1782

Sample Output

99

首先有裴蜀定理可知ax+by一定是gcd(a,b)的倍数。
也就是说ax+by能组成的最小正整数就是gcd(a,b)。
对多个数同理。
 
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int gcd(int x,int y) {return y?gcd(y,x%y):x;}
int main() {
	// freopen("min.in","r",stdin);
	// freopen("min.out","w",stdout);
	int ans=0,n;
	scanf("%d",&n);
	int i,x;
	for(i=1;i<=n;i++) scanf("%d",&x),x=x>0?x:-x,ans=gcd(ans,x);
	printf("%d
",ans);
}
原文地址:https://www.cnblogs.com/suika/p/9204329.html