logo AlgoBeat OnlineJudge 返回比赛
登录 注册

B. [Sleeping Cup #11] B. Closed Chaining Hash Table

内存限制:512 MiB 时间限制:1000 ms 输入文件:chaining.in 输出文件:chaining.out
题目类型:传统 评测方式:文本比较

题目描述

在本题中,你可以使用以下代码,并调用 divs(a, b) 以求出 取模的结果。你需要保证

int divs(int a, int b, int p = 1e9 + 7)
{
	if (b % a == 0) return b / a;
	int x = divs(p % a, a - b % a, a);
	return (1ll * x * p + b) / a;
}

众所周知,std::cc_hash_table 哈希表的原理是:对于每个可能的哈希值,当该哈希值的元素被插入多个时,将它们串成一个链表(新元素加在链表头部),查询时从对应哈希值的链表头部开始逐个扫描,直至找到待查询的元素,其中待查询的元素也需要扫描一次。

现有一个接受 种哈希值的 std::cc_hash_table 哈希表,向哈希表插入 个元素后查询 次,插入的元素取到各哈希值的概率相等,各个元素被查询的概率也相等,所有 个操作互相独立,那么 std::cc_hash_table 哈希表在 个查询中对元素的总扫描次数的期望是多少?

答案对 取模。

输入格式

一行三个正整数

输出格式

一行一个非负整数表示答案。

答案对 取模。

样例

样例输入

123 456 789

样例输出

890246157

数据范围与提示

样例解释

取模前的答案是