链接: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);elsea[(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;
}