题意:
给定一个长度为n的序列,每次可以将$ GCD(a_i,a_j)=min(a_k)|(1\leq k \leq n)$的两个数交换位置,求序列能否调整成单调不降序列,多组数据t
范围&性质:\(1\leq t \leq 10^4,1\leq n\leq 10^5\)
分析:
第一眼真的是一脸懵,这和GCD有什么关系
仔细分析发现只要,先对整个序列排个序,然后对于任意两个位置错乱的数$ a_i,a_j\(,如果\)GCD(a_i,a_j)=min(a_n)\(那么他们可以互换位置。若不满足,只要存在一个\)a_k\(满足\)GCD(a_i,a_k)=GCD(a_j,a_k)=min(a_n)\(那么他们就可以互相调整,转念一想\)min(a_n)\(不就是我们想要的\)a_k$ 吗?!!!也就是说对于每一个位置不对的数只要判断他是否是\(min(a_n)\)的倍数就可以了,若不是则无法调整,即无解
代码:
#include<bits/stdc++.h>
using namespace std;
namespace zzc
{
const int maxn = 1e5+5;
long long n,t,minn;
long long a[maxn],b[maxn];
bool flag;
void work()
{
scanf("%lld",&t);
while(t--)
{
flag=false;
minn=0x7ffffffffffff;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i];
minn=min(minn,a[i]);
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
{
if(a[i]==b[i]) continue;
if(b[i]%minn)
{
flag=true;
printf("No\n");
break;
}
}
if(flag) continue;
printf("Yes\n");
}
}
}
int main()
{
zzc::work();
return 0;
}