题目
题目的意思就是有一个哈希表,按照数值%M得到的结果放在表中,如果数值%M的位置已经被占用就使用二次探测法添加正增量,第一次数值%M+12,如果这个位置已经被占用接着查找关键字%M+22,如果被占用就接着查找依次是+32,+42,…,一直查找到+M2为止,如果还是没有位置放就输出“-”。
思路
有一个点M应该是一个素数,如果M不是一个素数就应该把M变成一个比M大的最小素数。先将m变成一个素数,设置一个k表示增量,每次只需要判断关键字%m+k*k是否被占用,每次让增量自增。
测试点1错误的原因就是因为M为1的情况应该变成2。
代码
#include <bits/stdc++.h>
using namespace std;
int prime(int val)//判断素数
{
int f=0;
if(val<2)
return 0;
for(int i=2;i<=sqrt(val);i++)
if(val%i==0)
f=1;
if(f==0||val==2)
return 1;
return 0;
}
int main()
{
int m,n,a[10010]={0},t,k=0;
cin>>m>>n;
for(int i=0;;i++)//将m变成一个素数
{
if(prime(m+i))
{
m+=i;
break;
}
}
for(int i=0;i<=m;i++)//重置数组,-1表示未被占用,1表示被占用
a[i]=-1;
for(int i=1;i<=n;i++)
{
k=0;//增量
cin>>t;
while(1)//添加正增量查找位置
{
if(a[(t%m+k*k)%m]==-1)
{
a[(t%m+k*k)%m]=1;
cout<<(t%m+k*k)%m;
break;
}
if(k==m)
{
cout<<"-";
break;
}
k++;
}
if(i!=n)
cout<<" ";
}
return 0;
}