您的位置:首页 > 其它

POJ 2769 Reduced ID Numbers 数学+暴力

2017-05-08 11:41 302 查看
河南省第十届省赛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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: