#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//平方探测法
#define MAXTABLESIZE 10000
//返回比N大比MAXTABLESIZE小的最小素数
int NextPrime(int N)
{
int i,p;
if(N==1)
return 2;
p=(N%2)? N+2:N+1;//从第一个奇数开始
while(p<=MAXTABLESIZE)
{
for(i=(int)sqrt(p);i>2;i--)
{
if(!p%i)
break;//不为素数,跳出循环
}
if(i==2)
break;//走完循环,则p为素数
else
p+=2;
}
return p;
}
int Hash(int Key,int TableSize)
{
return Key%TableSize;
}
int Find(int HashTable[],int Key,int Size)
{
int NewPos,CurrentPos;
NewPos=CurrentPos=Hash(Key,Size);
int CNum=0;//记录冲突次数
if(HashTable[NewPos]==-1)//位置空的,可以插入
{
HashTable[NewPos]=1;
return NewPos;
}
while(CNum<=Size&&HashTable[NewPos]!=-1)//还没遍历整个表或者位置已经被占
{
CNum++;
NewPos=(CurrentPos+CNum*CNum)%Size;
}
if(CNum>Size)
return -1;
else
{
HashTable[NewPos]=1;
return NewPos;
}
}
int main()
{
int i,M,N;
scanf("%d %d",&M,&N);//用户定的tablesize和插入的数字个数
int Size=NextPrime(M);//确定哈希表大小
int *HashTable=(int *)malloc(Size*sizeof(int));
//哈希表初始化,什么都没装
for(i=0;i<Size;i++)
HashTable[i]=-1;
int Key,Pos;
for(i=0;i<N;i++)
{
scanf("%d",&Key);
Pos=Find(HashTable,Key,Size);
if(Pos>=0)
printf("%d",Pos);
else
printf("-");
if(i!=N-1)
printf(" ");
}
return 0;
}