🍕🏠🌋 当前时间是:

 

CF1709F

传送门

description

给定 \(n,k,f\)。规定一个由长度为 \(n\) 的 01 串组成的多重集是合法的,当且仅当对于所有长度不超过 \(n\) 的非空 01 串(有 \(2^n-1\) 个)\(s\),有 \(p_s\leq c_s\)。其中,\(p_s\)\(s\) 在多重集中作为前缀的出现次数,\(c_s\) 是已知的一个 \([0,k]\) 间的正整数。

求有多少种合法的 \(c_s\),满足这些限制的最大的多重集的大小恰为 \(f\)

模 998244353。

  • \(n\leq 15\)

  • \(k,f\leq 2\times 10^5\)

solution

先考虑,对于给定的 \(c\) 值,如何计算最大多重集大小。

建出所有长度不超过 \(n\) 的 01 串的 trie 树。设 \(f_u\) 表示以 \(u\) 为根的子树构成的最大多重集大小。有转移:

  • \(f_u=c_u\)\(u\) 是叶子结点。

  • \(f_u=\min(c_u,f_{ls}+f_{rs})\)\(u\) 是非叶子节点,\(ls\) 是左二子,\(rs\) 是右儿子。

由此我们可以获得计数的方法。

\(f_{i,j}\) 是考虑以 \(i\) 为根,多重集最大大小恰好为 \(j\) 的方案数。可以得到转移:

  • \(f_{i,j}=1\),如果 \(i\) 是叶子结点且 \(j\leq k\)

  • \(f_{i,j}=(k+1-j)\sum\limits_{x=0} ^j f_{ls,x}f_{rs,j-x}+\sum\limits_{x=j+1} \sum\limits_{y=0}^x f_{ls,y}f_{rs,x-y}\),如果 \(i\neq 1\) 是非叶子节点且 \(j\leq k\)

  • \(f_{i,j}=\sum\limits_{x=0}^j f_{ls,x}f_{rs,j-x}\)

转移的意义是考虑当前位置的 \(c_i\) 的取值。

直接这样做当然是不行的。发现 trie 的同一层节点的 dp 值完全相同,于是可以把 \(2^n-1\) 个状态变成 \(n\) 个状态。

然后式子里的卷积形式可以 \(O(k\log k)\) 做掉,然后最后一项相当于一个后缀和,卷积完直接做。

时间复杂度 \(O(nk\log k)\)

code

Submission #231742083 - Codeforces

posted @ 2023-11-14 19:12  zzafanti  阅读(30)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end