#665 (Div. 2)C. Mere Array(思维)

题目描述

You are given an array a1,a2,…,an where all ai are integers and greater than 0.
In one operation, you can choose two different indices i and j (1≤i,j≤n). If gcd(ai,aj) is equal to the minimum element of the whole array a, you can swap ai and aj. gcd(x,y) denotes the greatest common divisor (GCD) of integers x and y.
Now you’d like to make a non-decreasing using the operation any number of times (possibly zero). Determine if you can do this.
An array a is non-decreasing if and only if a1≤a2≤…≤an.

Input

The first line contains one integer t (1≤t≤104) — the number of test cases.
The first line of each test case contains one integer n (1≤n≤105) — the length of array a.
The second line of each test case contains n positive integers a1,a2,…an (1≤ai≤109) — the array itself.
It is guaranteed that the sum of n over all test cases doesn’t exceed 105.

Output

For each test case, output “YES” if it is possible to make the array a non-decreasing using the described operation, or “NO” if it is impossible to do so.

Example

input
4
1
8
6
4 3 6 6 2 9
4
4 5 6 7
5
7 5 2 2 4
output
YES
YES
YES
NO

Note

In the first and third sample, the array is already non-decreasing.
In the second sample, we can swap a1 and a3 first, and swap a1 and a5 second to make the array non-decreasing.
In the forth sample, we cannot the array non-decreasing using the operation.

题目大意

给你一个含有n个数的序列a[]。你可以进行如下操作:
如果gcd(a[i],a[j])=a[]中数的最小值,那么我们就可以交换a[i],a[j]的位置。
问如果只进行该操作,能否讲a[]变为一个不下降的序列。

题目分析

因为交换两个数的条件为:gcd(a[i],a[j])=a[]中的最小值,因此可以进行交换的数只有min(a[])的倍数,而非min(a[])的倍数的数都不能进行交换
那么,我们可以将a[]与b[](排好序的a[])进行比较,如果某个位置上的a[i]不能被min(a[])整除且a[i]!=b[i],那么就无法通过该操作得到一个不下降的序列。及输出NO.

代码如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#include <iomanip>
#define LL long long
#define PII pair<int,int>
using namespace std;
const int N=1e5+5;
int a[N],b[N];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		int k=1e9;			//记录最小值
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]); 
			b[i]=a[i];		//b[]为排好序的a[]
			k=min(k,a[i]);
		}
		sort(b+1,b+1+n);
		bool flag=true;
		for(int i=1;i<=n;i++)
		{
			if(a[i]==b[i]||a[i]%k==0) continue;		//a[i]==b[i]或者a[i]能被k整除,则跳过
			flag=false;					//否则结果为NO
			break;
		}
		if(flag) puts("YES");
		else puts("NO");
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lwz_159

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值