xtuoj 哈希

题目

思路

代码流程

预处理素数:用埃氏筛法生成足够大范围内的所有素数(按升序排列),为后续查找做准备;

缩小查找范围:基于鸽巢原理,直接定位到第一个≥n/2 的素数(sz<n/2 时必然不满足要求,无需校验)

校验合法素数:从上述素数开始,按升序逐个验证:

  • 统计每个素数 sz 下,数组元素哈希值的出现次数(计数原理);
  • 找到第一个满足 "所有哈希值计数≤2" 的素数,即为答案。

核心依据

  • 选素数:素数作为哈希表大小能让哈希值分布更均匀,减少规律性冲突;
  • 范围优化:鸽巢原理(n 个元素放入 sz 个位置,sz<n/2 则必存在≥3 个元素映射到同一位置);
  • 合法性校验:计数原理(统计哈希值出现次数,量化冲突次数)。

代码

cpp 复制代码
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define MAX_SZ 10000

int T,n,cnt=0,a[1000];
int hash[MAX_SZ],primes[MAX_SZ];
bool st[MAX_SZ+1]={false};

void sieve(){
	for(int i=2;i<=MAX_SZ;i++){
		if(st[i]) continue;
		primes[cnt++]=i;
		for(int j=i*i;j<=MAX_SZ;j+=i){
			st[j]=true;
		}
	}
}

bool check(int n,int sz){
	memset(hash, 0, sizeof(int) * (sz+1));
	int i,k;
	for(i=0;i<n;i++){
		k=a[i]%sz;
		if(hash[k]++>1) return false;
	}
	return true;
}

int main() {
	int i;
	sieve();
	scanf("%d", &T);
	while (T--) {
		scanf("%d", &n);
		for (i = 0; i < n; i++) scanf("%d", &a[i]);
		for(i=0;primes[i]<(n>>1);i++);
		for(;!check(n,primes[i]);i++);
		printf("%d\n",primes[i]);
	}
	return 0;
}
相关推荐
灵感__idea6 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect16 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱1 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试