题目大意
有 $n$ 个人玩淘汰赛。
每一轮,假设当前还剩 $k$ 人,则他们随机分成 $\lfloor \frac k2 \rfloor$ 组($k$ 为奇数时有一人轮空),最后晋级 $\lceil \frac k2 \rceil$ 人。每个人能力互不相同,两人对打时一定是能力强者获胜。
求所有可能的局面数,答案对 $2^{64}$ 取模。
$1 \leq n \leq 10^{18}$
注意题面坑:Two tournaments are called different if there is a game (between two participants) in one of the tournaments that doesn’t occur in the other tournament. 这句话是错的!
题解
这题的难点在于揣摩出题人的正确题意
题意演我 3 个小时出题人今晚买菜必涨价
考虑递推。设 $f(n)$ 为 $n$ 个人时的方案数。
当 $n$ 为奇数时,设 $m=\lfloor \frac n2 \rfloor$,轮空一个人有 $n$ 种情况,分组有 $\frac{(2m)!}{2^m m!}$ 种情况(给 $2m$ 个人标号 $1$~$2m$,$i$ 和 $m+i$ 一组,然后去重),晋级的 $m+1$ 个人打接下来的比赛有 $f(m+1)$ 种情况,故
偶数同理,得到
如何求 $n!!~\text{mod}~2^{64}$ 呢?这个技巧还是不错的。
首先这个 $n$ 是个奇数,设 $P_k(x)=\prod_{i=1}^k(2x+2i-1)=(2x+1)(2x+3)\cdots(2x+2k-1)$,而这个 $P_k(0)$ 就是要求的值。
$P_k(x)$ 是关于 $x$ 的多项式,而这个多项式对于 $x^{64}$ 及以上的项,系数都含有 $2^{64}$,模意义下为 $0$,因此这个多项式只用考虑前 64 项($x^0$ 至 $x^{63}$)。因此这个多项式的普通乘法是 $O(64\cdot 64)$ 的。
考虑倍增求这个多项式,假设已知 $P_k(x)$,那么 $P_{2k}(x)=P_k(x)P_k(x+k)$,具体实现就先用 $O(64\cdot 64)$ 的时间求出 $P_k(x+k)$,然后再用 $O(64\cdot 64)$ 的乘法求出 $P_{2k}(x)$。通过 $P_{2k}(x)$ 求 $P_{2k+1}(x)$ 同理。
题面的题意
如果按照题面的题意要怎么做呢?
其实差别就是,比如 $n=3$ 的时候,3 先跟 1 打再跟 2 打,与 3 先跟 2 打再跟 1 打是等价的。
我们给要对打的两个人连边,它形成了一棵树,所以不同的局面数就是合法的生成树的个数。
有标号生成树计数,考虑 prufer 序。
然后不会了
代码
1 |
|