题意:给定n个不同的数字,求一个最小的数字m,使得这n个数字对m取模后仍然各不相同。
思路:没什么好的思路(二分显然不行,比如12和20这两个数模8同余,但是模7不同余),只能暴力。但是此题对memset有时间限制,hash的过程中如果每次都清空整个数组则会TLE,只清空本次枚举的m所需要的大小才能AC。
#include <stdio.h>
#include <string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define N 1000005
int s[305],hash[N];
int T,n;
int test(int x){
int i;
memset(hash, 0, x*sizeof(int));//这是本题的考察点
for(i = 0;i<n;i++){
if(hash[s[i]%x])
return 0;
hash[s[i]%x] = 1;
}
return 1;
}
int main(){
scanf("%d",&T);
while (T--) {
int i,j=0;
scanf("%d",&n);
for(i = 0;i<n;i++)
scanf("%d",&s[i]);
for(i = 1;;i++)
if(test(i))
break;
printf("%d\n",i);
}
return 0;
}