\quad 分两步走:
- 得到离Tsize最近的素数T,需注意1不是质数,题目中存在输入T=1这种情况
- 二次方探测,如果hashTable里面key % size的下标对应的hashTable为false,说明这个下标没有被使用过,直接输出。否则step步长从1加到size-1,一次次尝试是否能使index = (key + step * step) % size
#include <bits/stdc++.h>
using namespace std;
const int maxn = 20000;
int a[maxn];
bool vis[maxn] = {false};
int getNearPrime(int T)
{
int prime[maxn];
fill(prime, prime+maxn, 1);
prime[1] = 0; // 需注意1不是质数
for (int i = 2; i <= maxn; ++i)
{
for (int j = 2; j*i <= maxn; ++j)
{
prime[i*j] = 0;
}
}
int res = T;
for (int i = T; i <= maxn; ++i)
{
if(prime[i])
{
res = i;
break;
}
}
return res;
}
int main(int argc, char const *argv[])
{
int T, N;
cin >> T >> N;
T = getNearPrime(T);
for (int i = 0; i < N; ++i)
{
cin >> a[i];
}
for (int i = 0; i < N; ++i)
{
bool flag = false;
// 二次探测
for(int size=0; size<T; size++)
{
int temp = (a[i]+size*size)%T;
if(!vis[temp])
{
vis[temp] = true;
if(i!=0) cout << " ";
cout << temp;
flag = true;
break;
}
}
if(!flag)
{
if(i!=0) cout << " ";
cout << "-";
}
}
return 0;
}