题目链接:1078 Hashing
审题不难,思路也很简单。若M不为素数,先找出大于M的最小素数。所以,先打表素数。之后采用二次探测法进行哈希插入。输出在Hash表中id。若不能插入则输出 ‘-’。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 10020;
int visit[maxn],prime[1500],con = 0,hashlist[maxn];//prime大小取1500原因:10020 / ln(10020) == 1088,适当扩充得到
void getPrime()//此质数筛法时间复杂度约为O(N)
{
visit[1] = 1;
for(int i = 2; i <= maxn; ++i)
{
if(visit[i] == 0)
prime[con++] = i;
for(int j = 0; j <= con && i * prime[j] <= maxn; j++)
{
visit[i * prime[j]] = 1;
if(i % prime[j] == 0)
break;
}
}
}
int main()
{
getPrime();
int m,n,msize,i,temp;
cin >> m >> n;
if(visit[m] != 0)
{
for(i = 0; i != con && prime[i] < m; ++i);
msize = prime[i];
}
else
msize = m;
while(n--)
{
scanf("%d",&temp);
for(i = 0; i != msize; ++i)
{
if(!hashlist[(temp + i * i) % msize])//使用二次探测法解决冲突
{
hashlist[(temp + i * i) % msize] = temp;
break;
}
}
if(i != msize)
printf("%d",(temp + i * i) % msize);
else
printf("-");
if(n) printf(" ");
}
return 0;
}