NOD2308B. 酒杯(glass)

news/2024/10/24 22:24:02/文章来源:https://www.cnblogs.com/liyixin0514/p/18501396

NOD2308B. 酒杯(glass)

题意

有一棵 \(n\) 层的满二叉树,有 \(m\) 次操作,每次操作从 \(2^n-1\) 个节点中随机选择一个节点染黑(可以重复染色),问使得每一层都至少有一个节点被染黑的方案数。\(n,m\le 2000\),答案对 \(10^9 + 7\) 取模。

solution

%%% 蔡队

代码未编写,因此过程可能推错,请自行辨别 and 欢迎指出

显然问题可以简化成有 \(n\) 个点,第 \(i\) 个点有 \(2^{i-1}\) 种方式可以被染黑,问所有点都被染黑的方案数。

暴力就是枚举每次操作染了哪个点。

直接统计染上所有点的方案数是不好统计的。但是算至多可以染某些点的方案数是好算的。

考虑容斥。用点集 \(S\) 表示不允许染 \(S\) 里面的点。

子集枚举。

\[\begin{aligned} ans & =\sum_{S\subseteq [n]}(-1)^{|S|} (\sum_{i \not \in S} 2^i)^m\\ & = \sum_{S=0}^{2^n-1} (-1)^{count(S)} (2^n-1-S)^m \end{aligned} \]

\(S\) 表示允许染色的点集,那么有更加优美的式子:

\[f(n,m)=\sum_{S=0}^{2^n-1} (-1)^{n-count(S)} S^m \]

换个名字,写成:

\[f(n,m)=\sum_{i=0}^{2^n-1} (-1)^{n-count(i)} i^m \]

发现 \(f(n,m)\) 的个数是 \(nm\) 的,考虑变成递推转移。

假设我们考虑完前 \(n-1\) 个点,然后再加上第 \(n\) 个点,假设我们的 \(i\) 是把序号小的放在低位,有:

\(i\) 是把序号大的放在低位,式子会变好看吗?

\[f(n,m)=\sum_{i=0}^{2^{n-1}-1} (-1)^{n-count(i)} ((2i)^m - (2i+1)^m) \]

表示子集枚举前 \(i\) 个点的选择状态,乘方案数的时候枚举是否选择第 \(n\) 个数。\(2i\) 的状态表示不选,\(2i+1\) 的状态表示选择。

根据二项式定理\((x+y)^n = \sum_{i=0}^n \binom{n}{i} x^{n-i}y^i\)

\((2i+1)^m\) 拆开,变成 \(\sum_{k=0}^m \binom{m}{k} (2i)^k\)

有:

\[\begin{aligned} f(n,m) & =\sum_{i=0}^{2^{n-1}-1} (-1)^{n-count(i)} (\sum_{k=0}^{m-1} - \binom{m}{k}(2i)^k )\\ & =\sum_{i=0}^{2^{n-1}-1} (-1)^{n-count(i)-1} (\sum_{k=0}^{m-1} \binom{m}{k}(2i)^k )\\ & =\sum_{k=0}^{m-1} \binom{m}{k} 2^k \sum_{i=0}^{2^{n-1}-1} (-1)^{n-count(i)-1} i^k\\ & =\sum_{k=0}^{m-1} \binom{m}{k} 2^k f(n-1,k) \end{aligned} \]

至此你获得了转移复杂度为 \(O(m)\) 的递推式。状态是 \(O(nm)\),总时间复杂度是 \(O(nm^2)\)

边界条件是 \(f(0,0)=1\)

蔡队的分段打表方法(很有学习意义)

发现 \(f(n,m)\) 只和 \(f(n-1,k)\) 有关,因此对于第一维每隔 \(B\) 打一个长度为 \(m\) 的表。

然后发现空间不够。为什么 cplusoj 只能上传 50kb 的代码?解决方法是把表压成字符,使用表的时候进行解码操作。

题解提出倍增优化。

也许突破口是 \(f(n,m)\) 的具体意义感觉可以倍增?或许是因为 \(f(n,m)\) 只和 \(f(n-1)\) 有关,所以想要优化第一维的递推?类似于快速幂?

根据 \(f(2n,m)\) 的具体意义。考虑子集枚举前 \(n\) 个数的选择状态,乘方案数的时候枚举后 \(n\) 个数的选择状态。

\[\begin{aligned} f(2n,m) & =\sum_{i=0}^{2^{2n}-1} (-1)^{2n-count(i)} i^m\\ & = \sum_{i=0}^{2^n-1} (-1)^{n-count(i)} (\sum_{j=0}^{2^n-1} (-1)^{n-count(j)} (i+2^n j)^m)\\ & = \sum_{i=0}^{2^n-1} (-1)^{n-count(i)}(\sum_{j=0}^{2^n-1} (-1)^{n-count(j)} (\sum_{k=0}^m \binom{m}{k} i^{m-k} 2^{nk} j^k))\\ & = \sum_{k=0}^m \binom{m}{k} 2^{nk} \sum_{i=0}^{2^n-1} (-1)^{n-count(i)} i^{m-k} \sum_{j=0}^{2^n-1} (-1)^{n-count(j)} j^k \\ & = \sum_{k=0}^m \binom{m}{k} 2^{nk} f(n,m-k)f(n,k) \end{aligned} \]

好像……解决啦。Hooray!

但是 \(n\) 不一定是 \(2\) 的幂次怎么办呢?能否推广?

\[\begin{aligned} f(2n+n,m) & =\sum_{i=0}^{2^{2n}-1} (-1)^{2n-count(i)} (\sum_{j=0}^{2^n-1} (-1)^{n-count(j)} (i+2^{2n} j)^m)\\ & =\sum_{i=0}^{2^{2n}-1} (-1)^{2n-count(i)} (\sum_{j=0}^{2^n-1} (-1)^{n-count(j)} (\sum_{k=0}^{m} \binom{m}{k} i^{m-k} 2^{2nk}j^k ))\\ & =\sum_{k=0}^{m} \binom{m}{k} 2^{2nk} \sum_{i=0}^{2^{2n}-1} (-1)^{2n-count(i)} i^{m-k} \sum_{j=0}^{2^n-1} (-1)^{n-count(j)} j^k\\ & =\sum_{k=0}^{m} \binom{m}{k} 2^{2nk} f(2n,m-k) f(n,k) \end{aligned} \]

太优美了!可以推广!

那么就做完了,对 \(n\) 这一维倍增,时间复杂度 \(O(nm \log n)\)

code

待订正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/821401.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wireshark学习笔记

wireshark学习笔记 从一道面试题开始A ping B 理论分析注意:通过MAC判断--1单播,2组播,3广播, 手动修改MAC时不允许修改成组播或广播。 十六进制0x0b转为二进制时为11A需要判断B是否和它是一个网段 A通过自己的掩码判断自己的网段是192.168.26.0/24,用自己的掩码与B主机的…

免费的erp系统有哪些

在市场上,有一些免费的ERP系统,它们提供了成本效益高、功能齐全的解决方案。这些系统包括:1. Odoo;2.Dolibarr;3.ERPNext;4.xTuple PostBooks;5.FrontAccounting;6.Apache OFBiz;7.Metasfresh。Odoo是一个全面的开源ERP解决方案,适用于中小型企业,尤其是那些需要高度…

扩展KMP

前言 扩展KMP又称Z函数,可以快速的求出一个字符串的每一个后缀的与其的LCP(最大公共前缀)长度。 至于为什么要学习exKMP,因为(数据规模很上进)我们都是上进的OIer。 算法思路 暴力朴素的算法 将\(n\)个字符的字符串S中第\(i\)位开始的后缀与S的开头一一比较,求出LCP数组…

运算

模二加(异或)运算模 即取余 模运算 当两个整数 a 和 b 模 n 同余,记作 a≡b(mod n),意味着 a 和 b 被 n 除后余数相同。 基本性质:封闭性:如果 a≡b(mod n) 且 c≡d(mod n),那么 a+c≡b+d(mod n),以及 a⋅c≡b⋅d(mod n)。 乘法逆元:对于任何整数 a 和正整数 n,存在一…

Knapsack题解

题面下划线:符合单调性 举例:k=3W : 1 2 3 4 5V : 6 5 1 2 4g: 15 11 7 6 4

Win11安装基于WSL2的Ubuntu

详细介绍了Win11安装基于WSL2的Ubuntu的过程。1. 概述 趁着还没有完全忘记,详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WLS2现在被微软开发的比较强大了,还是很值得安装和使用的,笔者就通过WLS2安装的Ubuntu成功搭建了ROS环境。 2. 详论 2.1 子系统安装…

什么是芯片领域的敏捷设计(Agile Development)

芯片领域的敏捷设计是一种灵活的开发方法,致力于更快速、更高效地开发和优化集成电路(IC)和半导体技术。其核心特点包括:1、迭代开发;2、跨功能团队合作;3、客户反馈导向;4、及时响应变更。其中,迭代开发强调分阶段、小步快跑的设计方法,有助于快速地调整和优化设计。…

Clickhouse基本使用方法详细讲解(包括详细步骤及相关操作截图)

超详细ClickHouse学习笔记 一、ClickHouse概述 ClickHouse是一个用于在线分析处理查询(OLAP)的列式数据库管理系统(DBMS)。它由Altinity公司开发,支持线性扩展和高性能的数据压缩。ClickHouse以其卓越的数据处理速度而闻名,特别适合于大规模数据集的实时查询和分析。OLTP…

高ROI的行业或项目一般有什么样的特点

高ROI的行业或项目一般的特点有:1、市场需求的洞察;2、有效的成本控制;3、创新和技术应用;4、强大的市场定位;5、风险管理。实现高ROI的项目通常基于对市场需求的深刻洞察。这意味着项目管理者或企业家需要了解消费者的需求,预测市场趋势,并能够提供满足这些需求的产品或…

IDEA如何更改背景桌面图片

前言 我们在使用IDEA开发Java应用时,经常对着屏幕,有时候也感觉有点枯燥,这时候,就可以设置一个背景图片来缓解一下,比如说设置一张风景图片,或者设置一个美女图片,哈哈哈。 那么,我们可以如何设置呢? 如何设置 首先,我们打开设置面板。然后,我们点击下【Appearance…

灰色代码部分:要是输入名字列表,又能输出结果,但是空列表的时候就输出不了?

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【Aciel】问了一个Python基础的问题,问题如下:灰色代码部分:要是输入名字列表,又能输出结果,但是空列表的时候就输出不了?二、实现过程 这里【瑜亮老师】给了一个指导,具体如下所示:@Aciel 循环 for nam…

assembly2

汇编2 寄存器(不同架构不同) 8086中寄存器均为16位,可存放两个字节(1byte=8bit)。 通用寄存器AX,BX,CX,DX用来存储一般性的数据,被称为通用寄存器。二进制数据在寄存器中是低位存在低地址,高位存在高地址。也可将一个寄存器分为H,L(高8位低8位)来做8位存储器。字在寄存器…