1. 程式人生 > >bzoj1441 Min 裴蜀定理

bzoj1441 Min 裴蜀定理

Description


給出n個數(A1…An)現求一組整數序列(X1…Xn)使得S=A1 * X1+…An * Xn>0,且S的值最小

Solution


裴蜀定理:
對於形如 a x + b y =

c ax+by=c 這樣a、b、c都為正整數的不定方程,有解的條件是 g c d ( a ,
b ) c gcd(a,b)|c

即當 c = g c
d ( 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)
顯然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;
}