QOJ 8171 - Cola

我们假设目前 B 知道排列 \(p\) 的前 \(x\) 位是多少,那么下一次,B 的最优策略是:

  • 对于 \(i\le x\) 的部分,令 \(q_i=p_i\)
  • 对于 \(i=x+1\) 的部分,令 \(q_i\) 为任一 \(p_i\) 可能取到但没有被猜过的值。
  • 对于 \(i>x+1\),随机乱排剩余的 \(q_i\)

考虑设 \(c_i\) 表示第 \(i\) 次询问后 B 确定了 \(p\) 的前多少位。那么对于一组 \(\{c_i\}\),存在一种猜数的过程对应这个 \(c_i\) 的充要条件是,对于任意 \(0\le i<n\)\(c_{i}\le c_{i+1}\),序列 \(c\)\(i\) 的出现次数不超过 \(n-1-i\),因为当你确定了序列的前 \(i\) 位以后,\(i+1\) 位置上的值只有 \(n-i\) 种可能性,再问 \(n-1-i\) 次以后只剩唯一值了,下一步必然猜对。

然后我们发现一件事,就是对于所有合法的 \(\{c_i\}\),猜数过程恰好对应这组 \(\{c_i\}\) 的概率是相同的,都是 \(\dfrac{1}{n!}\)。对于一位 \(i\),假设 \(i\)\(c\) 数列中出现了 \(j\) 次,那么概率是 \(\dfrac{n-i}{n-i+1}·\dfrac{n-i-1}{n-i}·\cdots·\dfrac{n-i+1-j}{n-j+2-j}·\dfrac{1}{n-i+1-j}=\dfrac{1}{n-i+1}\),把它们乘起来刚好是 \(\dfrac{1}{n!}\)

于是问题变为怎么求合法的 \(\{c_i\}\) 的数量。

发现这个问题可以被转化为格路计数问题,即求有多少个 \((0,0)\to(m-1,n)\) 的路径,满足对于所有 \(0\le i<n\),路径在第 \(i\) 列上的部分的长度不超过 \(n-i-1\)。考虑容斥,钦定一些列 \(i\) 满足路径在第 \(i\) 列上的部分的长度至少为 \(n-i\),假设这些 \(i\) 组成的集合为 \(S\),令 \(s=\sum\limits_{x\in S}n-x\),那么实际上可以看作网格图缩短了 \(s\) 行,方案数就是 \(\dbinom{n+m-1-s}{n}\),再乘以容斥系数 \((-1)^{|S|}\) 就是这个 \(S\) 对答案的贡献。

用多项式的语言来刻画这个过程:令 \(P(x)=\prod\limits_{i=1}^n(1-x^i)\),那么答案为 \(\sum\limits_{s=0}^{m-1}\dbinom{n+m-1-s}{n}·[x^s]P(x)\)。因为本题 \(n\) 高达 \(10^7\),所以无法分治 NTT,但注意到因为 \(m\le n\),所以对于 \(s\le m-1\),有 \([x^s]\prod\limits_{i=1}^n(1-x^i)=[x^s]\prod\limits_{i=1}^{\infty}(1-x^i)\),而后者使用五边形定理可以 \(O(\sqrt{n})\) 求出。所以总复杂度就降至 \(O(n+m)\)

posted @ 2024-02-10 14:51  tzc_wk  阅读(54)  评论(0编辑  收藏  举报