注意:本题考察点–二次探查法的上限为所给的用于求余的素数
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#define maxSize 11111 //设置为10000就会出错
using namespace std;
int judgePrime(int ex) {//判断一个数是否为素数
int flag = 1;
if (ex <= 1) return 0;
for (int i = 2; i <= (int)sqrt(ex * 1.0); i++) {
if (ex%i == 0) {
flag = 0;
break;
}
}
return flag;
}
int main() {
int n, Tsize;
cin >> Tsize >> n;
int test[maxSize];
int place[maxSize] = { 0 };
for (int i = 0; i < n; i++) {
cin >> test[i];
}
while (!judgePrime(Tsize)) Tsize++; //扩大到素数
for (int i = 0; i < n - 1; i++) {
int temp = test[i] % Tsize;
int k = 1;
while (place[temp] && k < Tsize) { temp = (test[i] + k * k) % Tsize; k++; } //循环节为Tsize,二次探查法的上限
if (k >= Tsize) {
cout << "- ";
continue;
}
place[temp] = 1;
cout << temp << " ";
}
//单独输出最后一个数的序号,保证格式
int temp = test[n-1] % Tsize;
int k = 1;
while (place[temp] && k < Tsize) {
temp = (test[n-1] + k * k) % Tsize;
k++;
}
if (k >= Tsize) {
cout << "-" << endl;
return 0;
}
place[temp] = 1;
cout << temp;
cout << endl;
return 0;
}