通过这个题,了解了平方探测法,题目链接如下:
https://pintia.cn/problem-sets/1369134310032203776/problems/1369136586159349764
需要注意的一个点:如果i>=表长,那也将是无效探测,也就是插入不了了。
奉上代码:
#include<stdio.h>
int m,shu,prime,cnt,flag;
int vis[100010];
int judge(int prime)
{
if(prime<=1) return 0;
for(int i=2;i*i<=prime;i++)
if(prime%i==0) return 0;
return 1;
}
int main()
{
scanf("%d %d",&prime,&m);
while(1)
{
if(judge(prime))
break;
else prime++;
}
for(int i=0;i<m;i++)
{
scanf("%d",&shu);
int j=0;shu%=prime;
for(;j < prime;j ++) //如果j在[0,prime)都找不到位置,那么在j>=prime也找不到位置。
{
if(vis[(shu+j*j)%prime]==0)
{
vis[(shu+j*j)%prime]=1;
if(flag==0)
{
printf("%d",(shu+j*j)%prime);
flag++;
}
else printf(" %d",(shu+j*j)%prime);
break;
}
}
if(j==prime)
{
if(flag==0)
{
printf("-");
flag++;
}
else printf(" -");
}
}
}