首页 > 其他分享 >CF1709F

CF1709F

时间:2023-11-14 19:22:49浏览次数:26  
标签:limits rs sum 多重集 leq ls 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

标签:limits,rs,sum,多重集,leq,ls,CF1709F
From: https://www.cnblogs.com/FreshOrange/p/17832337.html

相关文章