C. Mere Array【1300 / 思维 数论】

在这里插入图片描述
https://codeforces.com/problemset/problem/1401/C
将其从小到大排序,挨个比较,将不是在正确位置上的数,存到ans里。
然后看ans里的每一个数和最小值gcd,看是不是最小值,如果是,那么这些数有一定可以通过某些变换到正确的位置上。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int a[N],b[N];
int gcd(int a,int b) {
    
    return b?gcd(b,a%b):a;}
int main(void)
{
    
    
	int t; cin>>t;
	while(t--) 
	{
    
    
		int n; cin>>n;
		for(int i=0;i<n;i++) cin>>a[i],b[i]=a[i];
		sort(b,b+n);
		vector<int>ans;
		for(int i=0;i<n;i++) if(a[i]!=b[i]) ans.push_back(a[i]);
		bool flag=true;
		for(int i=0;i<ans.size();i++) if(gcd(b[0],ans[i])!=b[0]) flag=false;
		if(flag) puts("YES");
		else puts("NO");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/bettle_king/article/details/121213966