链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805343236767744
题意:散列表,处理冲突用平方探测(只取正值)。输出平均查找次数。
思路:关键就在于这个,平均查找次数。如果平方探测该位置没有值或者探测到TableSize-1,退出。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+10;
const double eps = 1e-5;
ll mod,n,m,a[N],x,b;
bool isp(ll x){
if(x==1) return 0;
if(x<=3) return 1;
for(ll i=2;i*i<=x;i++)
if(x%i==0)
return 0;
return 1;
}
int main(){
cin>>mod>>n>>m;
while(!isp(mod))
mod++;
for(int i=1;i<=n;i++){
cin>>x;
b=0;
while(b<mod&&a[(x%mod+b*b%mod)%mod])
b++;
if(b==mod)
printf("%lld cannot be inserted.\n",x);
else
a[(x+b*b)%mod]=x;
}
double ans=0;
for(int i=1;i<=m;i++){
cin>>x;
b=0;
while(b<mod&&a[(x%mod+b*b%mod)%mod]&&a[(x%mod+b*b%mod)%mod]!=x)
b++;
ans+=b+1;
}
printf("%.1f",ans/m);
return 0;
}