题意
有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了两次。