【PAT甲级】1078 Hashing (25 分)(哈希表二次探测法)

题意:

输入两个正整数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 } 

 

 

 

posted @ 2019-11-08 15:41  sewage  阅读(583)  评论(0编辑  收藏  举报