PAT--1078 Hashing

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592

题目大意:哈希,H(key)=key%TSize,如果有碰撞,用平方检测法解决

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int m, n, cnt, prime[N];
bool vis[N], book[N];
void get_prime() {
	cnt = 0;
	vis[0] = vis[1] = 1;
	for(int i = 2; i < N; i++) {
		if(!vis[i]) prime[cnt++] = i;
		for(int j = 0; j < cnt; j++) {
			if(i * prime[j] >= N) break;
			vis[i * prime[j]] = 1;
			if(i % prime[j] == 0) break;
		}
	}
}
bool judge(int x) {
	if(x <= 1) return 0;
	for(int i = 2; i <= sqrt(x); i++) {
		if(x % i == 0) return 0;
	}
	return 1;
}
int main() {
	get_prime();
	scanf("%d %d", &m, &n);
	if(!judge(m)) {
		int i = 0;
		while(prime[i] < m) i++;
		m = prime[i];
	}
	for(int i = 1; i <= n; i++) {
		int x;
		scanf("%d", &x);
		int mod = x % m;
		if(!book[mod]) {
			printf("%d%s", mod, i == n ? "\n" : " ");
			book[mod] = 1;
		} else {
			int flag = 0;
			for(int j = 1; j < m; j++) {
				mod = (x + j * j) % m; // 平方检测法 
				if(!book[mod]) {
					printf("%d%s", mod, i == n ? "\n" : " ");
					book[mod] = 1;
					flag = 1;
					break;
				}
			}
			if(!flag) printf("-%s", i == n ? "\n" : " ");
		}
	}
	return 0;
}
发布了150 篇原创文章 · 获赞 4 · 访问量 6947

猜你喜欢

转载自blog.csdn.net/Napom/article/details/103038240