样例输入#
2
2
1 2
4
1 3 5 7
样例输出#
2
3
解题思路:欧拉筛素数
满足题意的素数值一定是从n/2开始的。原因:因为每个哈希函数值最多冲突一次,也就是一个哈希值最多出现2次,最坏的情况,数组中所有哈希值都出现2次,也就是说哈希值个数最少为n/2,素数p产生的哈希值有p个(0-p-1),所以p>=n/2。
用一个数组d记录冲突次数,素数每次循环要用memset函数清零,满足题意退出循环。
#include<stdio.h>
#include<string.h>
#define N 100005
int a[N]={};
int b[N]={};
void init(){int i,j,k=0;a[0]=1,a[1]=1;for(i=2;i<N;i++){if(a[i]==0)b[k++]=i;for(j=0;j<k;j++){if(i*b[j]>N)break;a[i*b[j]]=1;if(i%b[j]==0)break; }}
}
int main(){int T;scanf("%d",&T);init();while(T--){int n;scanf("%d",&n);int c[1005]={};int i,j;for(i=0;i<n;i++){scanf("%d",&c[i]);}//找不小于n/2的最小素数int t;for(i=0;;i++){if(b[i]>=n/2){t=i;break;}} int flag=1;int d[N]={};//记录冲突次数for(i=t;;i++){flag=1;//数组清零 memset(d,0,sizeof(d));for(j=0;j<n;j++){int m=c[j]%b[i];d[m]++;if(d[m]>2){flag=0;break;}}if(flag){printf("%d\n",b[i]);break;}}}
}