PAT 甲级 1078 Hashing
考察素数表的获取和散列表的平方探测法
#include <bits/stdc++.h>
using namespace std;
const int kPRIME_SIZE = 10010;
bool is_prime[kPRIME_SIZE];
void InitPrime()
{
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = false, is_prime[1] = false;
for (int i = 2; i < kPRIME_SIZE; ++i) {
if (is_prime[i]) {
for (int j = i * 2; j < kPRIME_SIZE; j += i) {
is_prime[j] = false;
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
InitPrime();
int m_size, n;
cin >> m_size >> n;
while (!is_prime[m_size]) ++m_size;
vector<int> hashtable(m_size, -1);
for (int i = 0; i < n; ++i) {
if (i != 0) cout << " ";
int val;
cin >> val;
int pos = val % m_size;
int step;
for (step = 0; step < m_size; ++step) {
pos = (val + step * step) % m_size;
if (hashtable[pos] == -1) {
// 插入成功
cout << pos;
hashtable[pos] = val;
break;
}
}
// 插入失败
if (step == m_size) cout << "-";
}
}