C. Mere Array

C. Mere Array

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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.

=========================================================================

非常巧妙的一个题目,首先来说,一个无规则数列进行排序,只需要将排序之后与原位置不对应的位置进行对比即可,也就是排序之后与排序之后位置上数字不对应的需要进行排序。

而我们根据冒泡排序等各种排序规则,两元素若能够自由交换,那么一定能够排序成功,而本题要求的条件略有苛刻,那就是要直接交换两个元素的话,必须满足gcd=mina,这个条件太苛刻了,我们冒泡排序无法成功。但是我们可以将这个条件再降一下标准

a b能够整除min,那么一定能够交换

证明如下

x  min   y  其中gcd(x,y)=k min 也就是x,y目前无法进行交换

min x y

y x min 

y min x

三步走,完成交换,min位置不变

#include<iostream>
#include<cstdio>
#include<queue>
# include<algorithm>
using namespace std;
int b[100000+10];
int a[100000+10];

int main()
{

    int t;
    cin>>t;

    while(t--)
    {
        int n,flag=0;
        cin>>n;

        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[i]=a[i];
        }
        sort(b+1,b+1+n);

        for(int i=1;i<=n;i++)
        {
            if(a[i]!=b[i])
            {
                if(b[i]%b[1])
                {
                    flag=1;
                    break;
                }
            }
        }

        if(flag)
        {
            cout<<"No"<<endl;
        }
        else
        {
            cout<<"YES"<<endl;

        }
    }

    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《SQL Queries for Mere Mortals》是一本以通俗易懂的方式介绍SQL查询语言的书籍。这本书适合于初学者和非专业人士,通过简洁明了的解释和示例,帮助读者理解和运用SQL查询语言。 该书分为三个部分,分别是"入门篇"、"进阶篇"和"高级篇"。在入门篇中,作者从基本的数据库概念开始,介绍了如何创建和管理数据库以及表格。然后,他详细讲解了SQL查询语句的基本语法和常见的查询操作,如SELECT、FROM、WHERE、ORDER BY等。通过实际的例子,读者可以逐步掌握SQL查询的基本技巧。 在进阶篇中,作者介绍了更复杂的查询操作和高级技巧。例如,使用连接(JOIN)进行多表查询、使用聚合函数进行统计和汇总、使用子查询进行嵌套查询等。这些内容对于想要深入学习SQL查询语言的读者来说非常有用。 最后,在高级篇中,作者讨论了一些高级的话题,如窗口函数、递归查询和存储过程。这些知识对于处理复杂的分析和数据处理任务非常重要。 《SQL Queries for Mere Mortals》提供了许多实用的技巧和经验,帮助读者更好地理解和应用SQL查询语言。无论是初学者还是非专业人士,都可以通过阅读这本书来快速入门并掌握SQL查询技能。不仅如此,该书还提供了大量的练习题和答案,读者可以通过实践来巩固所学知识。总体而言,这本书是一本很好的入门指南,能够帮助读者轻松地学习和运用SQL查询语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qinsanma and Code

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

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

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

打赏作者

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

抵扣说明:

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

余额充值