查询次数参考https://blog.csdn.net/qq_34594236/article/details/79814881
#include<iostream>
#include<cmath>
#include<vector>
#include<stdio.h>
using namespace std;
int getprimer(int n)
{
while(true)
{
bool flag = true;
int k = int(sqrt(double(n)));
for(int i=2;i<=k;++i)
{
if(n%i==0){
flag = false;
break;
}
}
if(flag) break;
n++;
}
return n;
}
int main()
{
int n,m,k;
cin>>n>>m>>k;
int tsize = getprimer(n);
// cout<<tsize<<endl;
vector<int> hashTable(tsize);
vector<bool> tags(tsize);
for(int i=0;i<n;++i)
{
tags[i]=false;
}
for(int i=0;i<m;++i)
{
int a;
cin>>a;
bool flag = false;
for(int j=0;j<tsize;++j)
{
int t = (a+j*j)%tsize;
if(tags[t]==false){
tags[t]=true;
hashTable[t]=a;
flag = true;
break;
}
}
if(flag == false)
cout<<a<<" cannot be inserted."<<endl;
}
int sum = 0;
for(int i=0;i<k;++i)
{
int a;
cin>>a;
int j;
int t;
for( j=0;j<tsize;++j)
{
t = (a+j*j)%tsize;
sum++;
if(tags[t]==true && hashTable[t]==a){ //找到了
break;
}
if(tags[t]==false) break; //定位探测到空位置,说明不在其中,结束探测
}
if(tags[t]==true&&hashTable[t]!=a) sum++; //0-tsize二次探测均探测,说明该元素无法插入,查询次数加1
}
printf("%.1f\n",1.0*sum/k);
return 0;
}