题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592
题目大意:哈希,H(key)=key%TSize,如果有碰撞,用平方检测法解决
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int m, n, cnt, prime[N];
bool vis[N], book[N];
void get_prime() {
cnt = 0;
vis[0] = vis[1] = 1;
for(int i = 2; i < N; i++) {
if(!vis[i]) prime[cnt++] = i;
for(int j = 0; j < cnt; j++) {
if(i * prime[j] >= N) break;
vis[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
bool judge(int x) {
if(x <= 1) return 0;
for(int i = 2; i <= sqrt(x); i++) {
if(x % i == 0) return 0;
}
return 1;
}
int main() {
get_prime();
scanf("%d %d", &m, &n);
if(!judge(m)) {
int i = 0;
while(prime[i] < m) i++;
m = prime[i];
}
for(int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
int mod = x % m;
if(!book[mod]) {
printf("%d%s", mod, i == n ? "\n" : " ");
book[mod] = 1;
} else {
int flag = 0;
for(int j = 1; j < m; j++) {
mod = (x + j * j) % m; // 平方检测法
if(!book[mod]) {
printf("%d%s", mod, i == n ? "\n" : " ");
book[mod] = 1;
flag = 1;
break;
}
}
if(!flag) printf("-%s", i == n ? "\n" : " ");
}
}
return 0;
}