天呐,我已经做了一天水题了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; }