题目链接:点击打开链接
题目大意:略。
解题思路:平方探测法处理哈希表,但是该题只能正增长:with positive increments only。即,hi=(h(key)+i*i)%m (0 ≤ i ≤ m-1),注意:类似样例中“15”是插入不进的这种数,理论上应该是 [0,size-1] == size 次,但是这里还要额外 +1 次,因为这 1 次是出于 di==size 时的探测才知道是否进入循环了,所以该次也要算进去。
AC 代码
using namespace std;
typedef long long ll;
const int maxn=1e4+10;
int vis[maxn], times[maxn*10];
int isPrime(int x)
{
if(x<2) return 0;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}
int main()
{
int p,n,q,a;
scanf("%d%d%d",&p,&n,&q);
while(!isPrime(p)) p++;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
int cnt=1;
for(int j=0;j<p;j++)
{
int idx=(j*j+a)%p;
if(vis[idx]==0)
{
vis[idx]=a;
break;
}
cnt++;
}
times[a]=cnt;
if(cnt==p+1) printf("%d cannot be inserted.\n",a);
}
double sum=0;
for(int i=0;i<q;i++)
{
scanf("%d",&a);
if(times[a]==0)
{
int cnt=1;
for(int j=0;j<p;j++)
{
int idx=(j*j+a)%p;
if(vis[idx]==0)
{
//vis[idx]=a; // 这里不能给它放上位置,会影响后面的数据到该位置时,误以为原本就有数据,则继续探测,影响结果
break;
}
cnt++;
}
times[a]=cnt;
}
sum+=times[a];
}
printf("%.1f\n",sum/q);
return 0;
}