「AtCoder Grand018A」Getting Difference(GCD)

题目链接A - Getting Difference

题意

有n(1~(10^5))个数(A_i) (1~(10^9)),每次选两个数,将它们的差的绝对值加入这堆数。问k(1~(10^9))是否可能出现在这堆数中。

题解

因为选择的数的差一定是这两个数的gcd的倍数,因此可以令g为所有数的gcd,那么g的不超过数组中最大值的倍数都是可以得到的。

代码

#include <cstdio>
#define N 100005
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
int n,k;
bool ans;
int a[N];
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]),ans|=a[i]>=k;
	int g=a[1];
	for(int i=2;i<=n;++i)
		g=gcd(a[i],g);
	ans&=(k%g==0);
	puts(ans?"POSSIBLE":"IMPOSSIBLE");
	return 0;
}

ps.我才不会说我gcd写错给wa了两次。

原文地址:https://www.cnblogs.com/flipped/p/7226578.html