1. 程式人生 > >pat 甲級 1078(hash二次探測法)

pat 甲級 1078(hash二次探測法)

題目連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592

思路:

就是有一個二次探測法的公式:hi = (h(x)+i*i)%m;

二次探索:https://blog.csdn.net/xyzbaihaiping/article/details/51607770

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 14000;
int n,m,a[maxn],vis[maxn];
int is_p(int x)
{
	if(x==1) return 0;
	if(x==2||x==3) return 1;
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0) return false;
	}
	return true;
}
int main(void)
{
	int i,j,x;
	scanf("%d%d",&m,&n);
	while(is_p(m)==0) m++;
	for(i=0;i<n;i++)
	{
		scanf("%d",&x);
		if(i) printf(" ");
		for(j=0;j<m;j++)
		{
			if(vis[(x+j*j)%m]==0)
			{
				printf("%d",(x+j*j)%m);
				vis[(x+j*j)%m]=1;
				break;
			}
		}
		if(j==m) printf("-");
	}
	printf("\n");
	return 0;
}

參考文章:https://blog.csdn.net/xtzmm1215/article/details/38390721