题意:
输入两个正整数M和N(M<=10000,N<=M)表示哈希表的最大长度和插入的元素个数。如果M不是一个素数,把它变成大于M的最小素数,接着输入N个元素,输出它们在哈希表中的位置(从0开始),如有冲突采取二次探测法处理冲突。
trick:
测试点1包含M为1的数据,1不是素数。。。
AAAAAccepted code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[10007]; 4 int ans[10007]; 5 int vis[100007]; 6 int main(){ 7 ios::sync_with_stdio(false); 8 cin.tie(NULL); 9 cout.tie(NULL); 10 int m,n; 11 cin>>m>>n; 12 int flag=0; 13 for(int i=2;i*i<=m;++i) 14 if(m%i==0){ 15 flag=1; 16 break; 17 } 18 if(flag||m==1) 19 for(int i=m+1;;++i){ 20 int flag2=0; 21 for(int j=2;j*j<=i;++j) 22 if(i%j==0){ 23 flag2=1; 24 break; 25 } 26 if(!flag2){ 27 m=i; 28 break; 29 } 30 } 31 for(int i=1;i<=n;++i) 32 cin>>a[i]; 33 for(int i=1;i<=n;++i){ 34 int tamp=a[i]%m; 35 if(!vis[tamp]){ 36 vis[tamp]=1; 37 ans[i]=tamp; 38 } 39 else{ 40 int flag3=0; 41 for(int j=1;j<n;++j) 42 if(!vis[(tamp+j*j)%m]){ 43 vis[(tamp+j*j)%m]=1; 44 ans[i]=(tamp+j*j)%m; 45 flag3=1; 46 break; 47 } 48 if(!flag3) 49 ans[i]=-1; 50 } 51 } 52 for(int i=1;i<=n;++i){ 53 if(ans[i]==-1) 54 cout<<"-"; 55 else 56 cout<<ans[i]; 57 if(i<n) 58 cout<<" "; 59 } 60 return 0; 61 }