原题链接:整齐的数组 - 题目 - Daimayuan Online Judge
解题思路:首先我们考虑不输出-1的情况。假设所有的数字都减到数组中最小的值,那么所有的差(不包含0)的最大公因数就是我们所需的值。那么肯定有人要问了,为什么减到最小值就不减了呢?因为如果最小值也减(在这种情况下)那么还要考虑最小值到同一值的差,最大公因数便必然小于等于只减到最小值的情况下最大公因数。
而输出-1,即可以减任意数,当且仅当所有数相同时,才会如此。首先证明充分性:当所有值都相同时,自然一起减去任何数都相同。
而必要性可以利用反证法,如果数组中有不同的值,那么数组内所有值减到相同值的差的最大公因数必然为一个确定值,而该确定值必然不可能被所有属于整数集的数整除。
AC代码:
#include<bits/stdc++.h>
using namespace std;
long long t,n,k,a[100],minn;
int main(){
scanf("%lld",&t);
while(t--){
minn=1000000010;//数组内最大值不大于1e9,保证更新最小值,所以取大于1e9的值为初始值
k=0;
scanf("%lld",&n);
for(int i=0;i<n;i++){//输入
scanf("%lld",&a[i]);
minn=min(minn,a[i]);//找最小值
}
for(int i=0;i<n;i++){//循环查每一个数的差
if(a[i]-minn){//如果不为0,说明该差也需要与其他差一起求最大公因数
if(k==0) k=a[i]-minn;//如果k为0说明之前还没更新过,直接将k赋值
else k=__gcd(a[i]-minn,k);//否则就与原本的最大公因数再求一次最大公因数
}
}
if(k==0) printf("-1\n");//如果k为0说明所有数都相等,差值都是0,没有更新,符合第二段输出-1的情况
else printf("%lld\n",k);//不然输出最大公因数
}
return 0;
}