#include<iostream>
#include<vector>
using namespace std;
vector<bool>used(10003);
bool isprime(int k){
if(k==1)return false;
if(k==2||k==3)return true;
for(int i=2;i*i<=k;++i)
if(k%i==0)return false;
return true;
}
int main(){
int size,n;cin>>size>>n;
while(!isprime(size))++size;
int fls=0;
while(n--)
{
int k;cin>>k;
for(int i=0;i<size;++i)
{
int pos=(k+i*i)%size;
if(!used[pos])
{
used[pos]=true;
cout<<(fls++?" ":"")<<pos;
break;
}//if
if(i==size-1)cout<<(fls++?" ":"")<<'-';
}//for
}//while
}
这个判断一个positive integer是否为素数的isprime(int k)很关键,要注意123都要特殊判断,用那个循环判断不行的。
(key +/- i*i)%size i=[1..size-1]是正宗的二次探测,这里只用加。(key + i)%size i=[1..size-1]是线性探测