二次探测法。表示第一次听说这东西。。。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std; const int maxn=20000; bool flag[maxn]; long long m,n; bool prime(long long x) { if(x==1) return 0; if(x==2) return 1; for(long long i=2;i*i<=x;i++) if(x%i==0) return 0; return 1; } int main() { memset(flag,0,sizeof flag); scanf("%lld%lld",&m,&n); while(1) { if(prime(m)) break; m++; } for(long long i=1;i<=n;i++) { long long num; scanf("%lld",&num); int p=-1; for(long long j=0;j<m;j++){ if(flag[(num+j*j)%m]==0) { flag[(num+j*j)%m]=1; p=(num+j*j)%m; break; } } if(p==-1) printf("-"); else printf("%d",p); if(i<n) printf(" "); else printf(" "); } return 0; }