P4549 【模板】裴蜀定理
P4549 【模板】裴蜀定理
题目描述
给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1X1+...AnXn>0,且S的值最小
输入输出格式
输入格式:
第一行给出数字N,代表有N个数 下面一行给出N个数
输出格式:
S的最小值
飞鼠定理:
对于两个数 \(a, b\) 有 \(ax + by = gcd(a,b)\) 存在解
推广: 对于多于 \(2\) 个的数, 有 \(ax + by + cz + ... = gcd(a, b, c, ...)\)
故此题直接求解全部数的 \(gcd\) 即可
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
typedef long long LL;
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}
int num, ans;
int main(){
int num = RD();ans = RD();
if(num == 1){printf("%d\n", abs(ans));return 0;}
for(int i = 2;i <= num;i++){
int temp = abs(RD());
ans = gcd(ans, temp);
}
printf("%d\n", ans);
return 0;
}