有一点不过,感觉是hash范围有问题,如果开足够大,总能找到
#include <cstdio>
#include <cmath>
#include <cstring>
#define MAX 10010
int prime[MAX];
bool p[MAX];
int cntp=0;
void findp(){
memset(p,0,sizeof(p));
for(int i=2;i<MAX;i++){
if(p[i]==false){
prime[cntp++]=i;
for(int j=i+i;j<MAX;j+=i){
p[j]=true;
}
}
}
}
int hash[MAX];
int puth(int x,int m){
int tmp=x%m;
int i=1;
int fan=MAX<m?m:MAX;
while(hash[tmp]!=-1 && i<fan){
tmp=(x+i*i)%m;
i++;
}
if(hash[tmp]==-1){
hash[tmp]=1;
return tmp;
}else{
return -1;
}
}
int main(){
freopen("in.txt","r",stdin);
findp();
memset(hash,-1,sizeof(hash));
int m,n;
scanf("%d %d",&m,&n);
if(p[m]==true){
for(int i=m+1;i<MAX;i++){
if(p[i]==false){
m=i;
break;
}
}
}
for(int i=0;i<n;i++){
int a;
scanf("%d",&a);
a=puth(a,m);
if(i+1==n){
if(a!=-1){
printf("%d\n",a);
}else{
printf("-\n");
}
}else{
if(a!=-1){
printf("%d ",a);
}else{
if(a!=-1){
printf("- ");
}
}
}
}
return 0;
}