有 n 个数都大于 0,如果有两个数的 GCD =(n 个数中的最小值),那么这两个数可以任意地交换,判断是否可以将这 n 个数变成单调递增的数组
a[i] 排完序之后所对应的数 b[i],要满足所有没有与 b[i] 对应的数 a[i] 可以与其余的所有没对应的数 a[i] 都相互交换
这样只要 minn 与所有需要移动的数 a[i] 的 GCD==minn 即可
const int N=1e5+5;
int n,m,t;
int i,j,k;
int a[N];
int b[N];
int main()
{
IOS;
rush(){
cin>>n;
int minn=1e9;
for(i=1;i<=n;i++) cin>>a[i],b[i]=a[i],minn=min(minn,a[i]);
sort(b+1,b+1+n);
int flag=1;
for(i=1;i<=n && flag;i++){
if(a[i]==b[i]) continue;
if( __gcd(a[i],minn)==minn ) continue;
else flag=0;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
//PAUSE;
return 0;
}