题意: 二次哈希散列
#include<iostream>
using namespace std;
int prime[1000002]= {1,1,0};
void isprime() {
for(int i=2; i<1000002; ++i)
if(!prime[i])
for(int j=i*2; j<1000002; j+=i)
prime[j]=1;
}
int main() {
isprime();
int m,n;
cin>>m>>n;
int t=m;
for(int i=m; i<1000002; ++i)
if(!prime[i]) {
m=i;
break;
}
int ans[n];
for(int i=0; i<n; ++i)
ans[i]=-1;
int temp[m]= {0};//碰撞检测
for(int i=0; i<n; ++i) {
int k;
cin>>k;
for(int j=0; j<=t; ++j) {
int d=j*j;//二次探测
if(!temp[(k+d)%m]) {
temp[(k+d)%m]=1;
ans[i]=(k+d)%m;
break;
}
}
}
cout<<ans[0];
for(int i=1; i<n; ++i)
if(ans[i]!=-1)
cout<<" "<<ans[i];
else cout<<" -";
return 0;
}