考查散列表的二次探测再散列
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
bool isPrime(int n){
if(n <= 1) return false;
for(int i = 2; i*i <= n; ++i){
if(n%i == 0) return false;
}
return true;
}
int main(){
int msize, n;
scanf("%d%d", &msize, &n);
while(!isPrime(msize)) ++msize;
vector<bool> used(msize, false);
for(int i = 0; i < n; ++i){
int key, h;
scanf("%d", &key);
h = key%msize;
if(i) printf(" ");
if(used[h]){
int i;
for(i = 0; i < msize; ++i){
if(!used[(key+i*i)%msize]){
used[(key+i*i)%msize] = true;
printf("%d", (key+i*i)%msize);
break;
}
}
if(i == msize) printf("-");
}
else{
used[h] = true;
printf("%d", h);
}
}
return 0;
}