主要注意的是当用平方法探测的时候,要每次都取余
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int a[100000],ha[100000];
int main()
{
int n,m,i,j,k;
while(~scanf("%d%d",&n,&m))
{
memset(ha,0,sizeof(ha));
for(i=0;i<n;i++)
{
j=1;
scanf("%d",&a[i]);
int t=a[i]%m;
if(!ha[t])
{
ha[t]=a[i];
if(i!=n-1)
printf("%d ",t);
else
printf("%d\n",t);
}
else
{
int tmp=j*j;
while(ha[(t+tmp)%m ]&&ha[ (t-tmp)%m ])
{
j++;
tmp=j*j;
}
if( !ha[(t+tmp)%m ] )
{
ha[(t+tmp)%m]=a[i];
if(i!=n-1)
printf("%d ",(t+tmp)%m );
else
printf("%d\n",(t+tmp)%m );
}
else if( !ha[(t-tmp)%m] )
{
ha[(t-tmp)%m]=a[i];
if(i!=n-1)
printf("%d ",(t-tmp)%m );
else
printf("%d\n",(t-tmp)%m );
}
}
}
}
return 0;
}