ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ARC143 F Counting Subsets

2022-07-21 00:01:36  阅读:181  来源: 互联网

标签:Subsets text 复杂度 ARC143 枚举 Theta Counting 我们 dp


  • 题意

    给定正整数 \(n\),求有多少 \(\{1,2,\dots ,n\}\) 的子集 \(S\) 满足任意一个 \(1\) 到 \(n\) 到整数都能被表示成 \(S\) 的子集和,且方案数小于等于 \(2\)。

    对 \(998244353\) 取模。

    \(n\le 1500\)

  • 题解

    一看到这个,就想到 AHOI 的山河重整,但做法完全不同。

    考虑用背包判定 \(S\) 合法性的过程,设背包的 \(\text{dp}\) 数组为 \(f\),从 \(0\) 开始。

    每加入一个数相当于是将 \(f\) 平移若干位然后对位相加。

    这启发我们考虑第一次出现有一个数方案数为 \(2\) 的情况,这相当于枚举第一个不是 \(2\) 的次幂的数,设为 \(a\)。

    在加入 \(a\) 后,我们的 \(f\) 应该形如 \(a\) 个 \(1\),若干个 \(2\) ,\(a\) 个 \(1\)。

    忽略首尾的 \(1\),我们发现接下来每次操作相当于把 \(f\) 复制一遍,并在两段中间插入一个长为 \(a\sim 2a\) 的连续段。

    这是一个满二叉树结构,每个点为一个连续段,因此我们可以考虑再枚举这棵树总长度第一次大于等于 \(n\) 时的节点数。

    注意到一个问题:我们只对 \(1\sim n\) 的数有所限制,大于 \(n\) 的数是无所谓的。

    那么我们求的就不是合法树个数,而是每个合法情况下,\(n\) 和前面第一个 \(2\) 的距离和。

    如果直接 \(\text{dp}\),每次加一个根,我可能只会一个复杂度很高的算法(如果有会的求指教)。

    我们考虑继续枚举一个二叉树上的点 \(x\),满足恰好 \(\text{dfs}\) 序小于等于它的点的长度和大于等于 \(n\)。

    这样我们就确定了每一层的点选的个数,逐层 \(\text{dp}\) 是容易的,最后算贡献需要一些分类讨论。

    我们来算一下复杂度。

    对于每一个 \(a\),我们枚举的点 \(x\) 的个数是 \(\Theta(n/a)\) 的,对于一个 \(x\),\(\text{dp}\) 复杂度是 \(\Theta(n\log \frac{n}{a})\) 的,总复杂度 \(\Theta(n^2\log^2 n)\)。

标签:Subsets,text,复杂度,ARC143,枚举,Theta,Counting,我们,dp
来源: https://www.cnblogs.com/leukocyte/p/16500383.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有