CodeForces 1401C Mere Array(数论)

You are given an array a1,a2,…,ana1,a2,…,an where all aiai are integers and greater than 00.

In one operation, you can choose two different indices ii and jj (1≤i,j≤n1≤i,j≤n). If gcd(ai,aj)gcd(ai,aj) is equal to the minimum element of the whole array aa, you can swap aiai and ajaj. gcd(x,y)gcd(x,y) denotes the greatest common divisor (GCD) of integers xx and yy.

Now you'd like to make aa non-decreasing using the operation any number of times (possibly zero). Determine if you can do this.

An array aa is non-decreasing if and only if a1≤a2≤…≤ana1≤a2≤…≤an.

Input

The first line contains one integer tt (1≤t≤1041≤t≤104) — the number of test cases.

The first line of each test case contains one integer nn (1≤n≤1051≤n≤105) — the length of array aa.

The second line of each test case contains nn positive integers a1,a2,…ana1,a2,…an (1≤ai≤1091≤ai≤109) — the array itself.

It is guaranteed that the sum of nn over all test cases doesn't exceed 105105.

Output

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

Example

input

Copy

4
1
8
6
4 3 6 6 2 9
4
4 5 6 7
5
7 5 2 2 4

output

Copy

YES
YES
YES
NO

Note

In the first and third sample, the array is already non-decreasing.

In the second sample, we can swap a1a1 and a3a3 first, and swap a1a1 and a5a5 second to make the array non-decreasing.

In the forth sample, we cannot the array non-decreasing using the operation.

https://codeforces.com/contest/1401/problem/C

题解:刚开始考虑计算两两的gcd,但是数据规模较大会TLE。细想发现min的倍数都可以任意交换,因为min和它的任意倍数gcd

都是自己,将min作为跳板可以使它的倍数任意交换。容易想到将满足交换条件的数进行排序,最后验证是否升序。但是n^2排序会TLE,快排不好实现。换一个方式,将数组排序后,与原数组比对,如果该位置的数不能交换且顺序错误,即不能满足条件

代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100000;
int a[maxn+1],b[maxn+1];


int main()
{
	int m;
	cin>>m;
	
	for (int i=1;i<=m;i++)
	{
		int n;
		cin>>n;
		int mini=1000000000;
		for (int j=1;j<=n;j++)
		{
			cin>>a[j];
			mini=min(a[j],mini);
			b[j]=a[j];
		}
		sort(b+1,b+n+1);
		bool flag=true;
		for (int j=1;j<=n;j++)
		{
			if ((a[j]!=b[j])&&(a[j]%mini!=0))
			{
				cout<<"NO"<<endl;
				flag=false; 
				break;
			}
		}
		if (flag) cout<<"YES"<<endl;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值