POJ 2769 Reduced ID Numbers 数学+暴力
河南省第十届省赛C题
题意是给你n个数,你需要找到一个数x,使得这n个数对x的余数都不一样
假设a和b对x同余,那么就是(a-b)%x=0
那么意味着,我们需要知道所有数的差值,我们的x不能是其中的约数
所有数的差值直接二维暴力处理,因为数据很小,可以开个一维数组判断某个值是否存在于差值中
我们要求最小的x,那么从1开始往上枚举,类似素数筛法,复杂度是mlog(m),m是枚举的最大可能值,在这里是1e6的级别,所以不会超时
判断条件是:x的所有倍数都不在差值里就是我们需要的值
//#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=400;
const int maxm=1e6+50;
int T,n;
int a[maxn];
int has[maxm];
bool ok(int x){
for(int i=x;i<1e6;i+=x)
if (has[i]) return false;
return true;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(has,0,sizeof(has));
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if (a[i]>a[j])
has[a[i]-a[j]]=1;
else
has[a[j]-a[i]]=1;
for(int ans=1;;ans++)
if (ok(ans)){
printf("%d\n",ans);
break;
}
}
return 0;
}