AGC 018 A - Getting Difference

题面在这里!

 

    天呐,我已经做了一天水题了mmp

    养生最重要,恩。

    首先发现最终序列里的元素肯定是 <= max 的,因为无论何时序列里都不会有负数,所以减的话不会变大(反向大只有>2*max才行,这显然不可能)。

    并且新加的元素可以是 序列中原来元素任意线性组合得到的,所以一下子想到了gcd。

    只有max >= k 且 max-k是gcd倍数的时候才是POSSIBLE,为什么呢?

    第一个之前已经说了,第二个的话发现是  (max-k , gcd) = gcd,左边可以减去任意倍的gcd得到序列中其他>k的元素。

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;

inline int read(){
	int x=0; char ch=getchar();
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	return x;
}

int gcd(int x,int y){ return y?gcd(y,x%y):x;}

int n,mx,g,k;

int main(){
	n=read(),k=read();
	for(int i=1,now;i<=n;i++){
		now=read();
		mx=max(mx,now);
		g=gcd(g,now);
	}

	if(k<=mx&&!((mx-k)%g)) puts("POSSIBLE");
	else puts("IMPOSSIBLE");

	return 0;
}

 

posted @ 2018-07-11 18:40  蒟蒻JHY  阅读(184)  评论(0编辑  收藏  举报