AcWing 1638. 哈希 - 平均查找时间
原题链接
简单
作者:
alxmn
,
2021-03-07 19:07:32
,
所有人可见
,
阅读 519
#include<iostream>
#include<cmath>
using namespace std;
const int N=10010;
int n,m,mm;
int ans;
int h[N];
bool prime(int x)
{
if(x==2) return true;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0) return false;
}
return true;
}
int main()
{
cin>>m>>n>>mm;
for(int i=m;;i++)
if(prime(i))
{
m=i;
break;
}
for(int i=0;i<n;i++)
{
int x;
cin>>x;
if(!h[x%m]) h[x%m]=x;
else
{
int j;
int st;
for(j=0;j<m;j++)
{
st=x%m+j*j;
if(st%m>m)
{
cout<<x<<" cannot be inserted."<<endl;
break;
}
if(!h[st%m])
{
h[st%m]=x;
break;
}
}
if(j>=m) cout<<x<<" cannot be inserted."<<endl;
}
}
for(int j=0;j<mm;j++)
{
int x,i;
cin>>x;
for(i=0;i<m;i++)
{
// 若当前位置存储 x 则找到,若当前位置为空则说明 x 没有被存入
if(h[(x%m+i*i)%m]==x||!h[(x%m+i*i)%m]) break;
}
ans+=i+1;
}
cout<<ans<<endl;
printf("%.1f",ans*1.0/mm);
return 0;
}
st%m>m,,这是怎么来的