#P14529. [2026年省队模拟联测]哈希表

    ID: 13746 传统题 4000ms 512MiB 尝试: 1 已通过: 1 难度: 9 上传者: 标签>CF2600数论并查集枚举模拟搜索组合数学贪心

[2026年省队模拟联测]哈希表

【题目描述】

C 最近在学哈希表。某天他看到这样一段代码:

// h is the hash table.
int a[N];
void add(long long &cnt, long long x, long long len) {
	long long y = x % len;
	while(h[y] != -1 && h[y] != x)
		y = (y + 1) % len, cnt ++;
	h[y] = x;
}
long long solve(long long len) {
	for(int i = 0; i < len; i ++) h[i] = -1;
	long long cnt = 0;
	for(int i = 1; i <= n; i ++) add(cnt, a[i], len);
	return cnt;
}

他忽然想到一个问题:如果给定 aia_i 并保证互不相同,让 lenlen[n,263)[n,2^{63}) 之间任意选定,那么 solve(len)solve(len) 能取得的最大值是多少呢?

【输入格式】

第一行一个整数 typetype,表示该数据属于的子任务的编号。

第二行一个整数 nn

第三行 nn 个整数表示 a1,a2,,ana_1,a_2,\ldots,a_n

【输出格式】

输出一行一个整数表示 solve(len)solve(len) 可能取得的最大值。

【输入输出样例1】

hash.in hash.out
9
3
2 4 6
1

【输入输出样例 1 说明】

解释:当 len=4len=4 时,有 solve(len)=1solve(len)=1,可以证明没有更大的答案。

【输入输出样例2】

hash.in hash.out
9
6
1 2 3 7 8 9
8

【输入输出样例 2 说明】

解释:当 len=6len=6 时,有 solve(len)=8solve(len)=8,可以证明没有更大的答案。

【数据规模与约定】

数据采用捆绑且依赖测试,你能获得一个子任务的分数当且仅当你通过了该子任务和其依赖的子任务的所有测试点。

子任务编号 nn\le a[i]a[i]\le 分数 依赖关系
#1 11 101810^{18} 1 #1
#2 22 4 #2
#3 33 10 /
#4 200200 15
#5 1010 10910^9 30
#6 150150 6 #5
#7 2020 101810^{18} 14 #3、#5
#8 200200 101310^{13} 16 #6
#9 101810^{18} 4 #4、#7、#8

对于子任务#4,保证a[i]a[i]在值域内等概率随机。

对于全部数据,满足1n200, 1a[i]10181\le n \le 200,~1 \le a[i] \le 10^{18}