这一题关键是英语的平方索引得翻译出来,那么也就是按平方索引得hash表
for (int i = 0; i <= N; i++)
{
int t = (x + i * i) % N;
if (h[t] == 0) {
h[t] = x;
break;
}
}
代码
#include <iostream>
using namespace std;
int N;
int h[100010];
bool judge(int x)
{
if (x < 2) return false;
for (int i = 2; i <= x / i; i++) {
if (x % i == 0) return false;
}
return true;
}
int find(int x)
{
int cnt = 0;
for (int i = 0; i <= N; i++) {
int t = (x + i * i) % N;
cnt++;
if (h[t] == x || h[t] == 0) break;
}
return cnt;
}
int main()
{
int n, m;
cin >> N >> n >> m;
while (!judge(N)) N++;
for (int i = 0; i < n; i++) {
bool falg = false;
int x;
cin >> x;
for (int j = 0; j <= N; j++) {
int t = (x + j * j) % N;
if (h[t] == 0) {
falg = true;
h[t] = x;
break;
}
}
if (!falg) printf("%d cannot be inserted.\n", x);
}
double ans = 0;
for (int i = 0 ;i < m; i++) {
int x;
cin >> x;
ans += (double)find(x);
}
printf("%.1f\n", ans / m);
return 0;
}