洛谷 P3214 [HNOI2011] 卡农


题目传送门


前言

再次败在 d p dp dp 手下,但是数据范围这么小应该是可以看出是 d p dp dp 的(毕竟对于其他组合数的问题数据范围都是 1 0 9 10^9 109 起步)。


思路

题意简化

现有 1 , 2 , 3 , . . . , n − 1 , n 1, 2, 3, ... , n - 1, n 1,2,3,...,n1,n,从其所组成的 2 n − 1 2^n - 1 2n1 个非空集合中选出 m m m 个,每个集合只能选一次,求【使 ∀ i ∈ [ 1 , n ] \forall i \in [1, n] i[1,n] 在所选集合中,出现次数均为偶数的】的选择方案书,答案对 1 0 8 + 7 10^8 + 7 108+7 取模。

明确两点:

  1. 出现 0 0 0 次也算出现偶数次;
  2. 一个集合中,不可能出现两个相同的数(集合的互斥性)。

状态设计

d p i dp_i dpi 表示选了 i i i 个集合的合法方案数。
注意:在之后的转移使,我们先 只需要让这 i i i 个集合 满足“每个数出现次数为偶数”的限制。

状态转移

限制 1 1 1:每个数只能出现偶数次

首先看起来题目所给的“每个数出现偶数次”的限制不太好弄,所以我们先考虑假如已经有 i − 1 i - 1 i1 个确定的集合,可以怎么添加一个集合,使得这 i i i 个集合满足这条限制。

对于一个数 x x x

  1. 假如它在前 i − 1 i - 1 i1 个集合中出现了奇数次,那么它一定要在最后一个集合在出现一次,这样才能保证 x x x i i i 个集合中总共出现了偶数次;
  2. 假如它在前 i − 1 i - 1 i1 个集合中出现了偶数次,那么它就不可能出现在最后一个集合中,因为为了维持其出现偶数次,且每个集合不能出现相同的数,所以在最后一个集合中,其出现次数只能为 0 0 0

由上述看题解分析,假如已经确定了 i − 1 i - 1 i1 个集合,那最后一个集合就是确定的。

先不管其他限制,就但从这条限制来看,它就有 A 2 n − 1 i − 1 A_{2^n - 1}^{i - 1} A2n1i1 种可能(这里之所以是排列不是组合,是因为题目让我们求出的【所选集合方案是不顾选出集合顺序的】,所以我们在最后让答案乘以 m ! m! m! 的逆元就好了)。

限制 2 2 2:集合不能为空集

由于可能在前 i − 1 i - 1 i1 个集合中,每一个数都出现了偶数次,所以在最后一个集合中任何数都不能出现,即最后一个集合使空集,这样是不合法的。

我们从容斥角度考虑转移,看看最后一个集合为空集的有多少种可能。

把最后一个空集去除后,发现剩下的 i − 1 i - 1 i1 个集合正好是一个满足【取 i − 1 i - 1 i1 个集合使其满足 “每个数只能出现偶数次” 限制】的取集合方案(因为若最后一个集合为空集,那么前 i − 1 i - 1 i1 个集合就必定满足 “每个数出现偶数次” 限制),这样的情况有 d p i − 1 dp_{i - 1} dpi1 种。

所以在总的选择方案中减去 d p i − 1 dp_{i - 1} dpi1 就行。

限制 3 3 3:每个集合只能选一次,即不能出现两个相同的集合

由于前 i − 1 i - 1 i1 个集合一定互不相同(因为我们是从 n n n 个数组成的 2 n − 1 2^n - 1 2n1 个互不相同的集合中选出的),所以只考虑【第 i i i 个集合与前 i − 1 i - 1 i1 个集合中】有一个相同的方案。

先明确一点:假如 i i i 与前 i − 1 i - 1 i1 个集合中的某个相同(假设是第 j j j 个集合),那么决定第 i i i 个集合构造方法的就是集合 j j j

因此,我们如果去除集合 i , j i, j i,j,那么剩下的 i − 2 i - 2 i2 个集合一定能形成一组满足【取 i − 2 i - 2 i2 个集合使其满足 “每个数只能出现偶数次” 限制】的取集合方案。因为两个集合中的数相同,因此删除这两个集合的话,集合中的数也是成对被删除的,因此能构成。这样的 i − 2 i - 2 i2 个集合共有 d p i − 2 dp_{i - 2} dpi2 种。

又因为 j j j i − 1 i - 1 i1 种取法,集合 i i i 2 n − 1 − ( i − 2 ) 2^n - 1 - (i - 2) 2n1(i2) 种(即在所有的 2 n − 1 2^n - 1 2n1 个集合中,去除【已有的 i − 2 i - 2 i2 个集合】剩下的之中,再选一个),剩下的 i − 2 i - 2 i2 个集合共有 d p i − 2 dp_{i - 2} dpi2 种,所以这个非法方案数是 ( i − 1 ) × ( 2 n − 1 − ( i − 2 ) ) × d p i − 2 (i - 1) \times (2^n - 1 - (i - 2)) \times dp_{i - 2} (i1)×(2n1(i2))×dpi2

综上,转移方程就是:
d p i = A 2 n − 1 i − 1 − d p i − 1 − ( i − 1 ) × ( 2 n − 1 − ( i − 2 ) ) × d p i − 2 dp_i = A_{2^n - 1}^{i - 1} - dp_{i - 1} - (i - 1) \times (2^n - 1 - (i - 2)) \times dp_{i - 2} dpi=A2n1i1dpi1(i1)×(2n1(i2))×dpi2

边界条件

首先是 d p 1 = 0 dp_1 = 0 dp1=0:因为只选一个非空的不重集合就让每个数出现偶数次显然是不可能的;
其次是 d p 2 = 0 dp_2 = 0 dp2=0:因为要在前两个集合中,就使每个数出现偶数次,要么得是两个空集,要么两个集合就得一样,这样显然也是不合法的。

答案

d p m × i n v ( m ! ) dp_m \times inv(m!) dpm×inv(m!),因为题目要求出的集合是不顾 m m m 个集合顺序的,而在计算时我们有考虑了其顺序,所以要除去 m ! m! m!

复杂度

时间空间均为 O ( m ) O(m) O(m)


代码

#include <bits/stdc++.h>#define int long longusing namespace std;const int maxn = 1e6 + 7;
const int mod  = 1e8 + 7;int n, m;
int facm = 1, invm;
int tot;
int qpow(int x, int y) {int res = 1;for (; y; y >>= 1, x = x * x % mod)if (y & 1) res = res * x % mod;return res;
}int dp[maxn], A[maxn];
signed main() {scanf("%lld%lld", &n, &m);for (int i = 1; i <= m; ++i)facm = facm * i % mod;invm = qpow(facm, mod - 2);tot = (qpow(2, n) - 1 + mod) % mod;A[0] = 1;for (int i = 1; i <= m; ++i)A[i] = A[i - 1] * (tot - i + 1) % mod;dp[1] = dp[2] = 0;for (int i = 3; i <= m; ++i)dp[i] = ((A[i - 1] - dp[i - 1] - (tot - i + 2) * (i - 1) % mod * dp[i - 2] % mod) % mod + mod) % mod;printf("%lld\n", dp[m] * invm % mod);return 0;
}

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

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

相关文章

【年份数据类型及使用】

在数据分析中,年份的处理需要根据具体场景选择合适的数据类型,以确保后续分析的准确性和效率。以下是常见的年份数据类型及使用场景: 1. 数值类型(整数或浮点数) 适用场景: 仅需存储年份数值(如 2020, 2023),无需进行日期计算。需要将年份作为连续变量参与数学运算(如…

详解七大排序

目录 一.直接插入排序 &#xff08;1&#xff09;基本思想 &#xff08;2&#xff09;算法步骤 &#xff08;3&#xff09;代码实现 &#xff08;4&#xff09;算法特性 &#xff08;5&#xff09;算法优化 &#xff08;6&#xff09;示例演示 二.希尔排序 &#xff08…

YOLOv12 训练从这里开始:LabelImg 标注数据集

视频讲解&#xff1a; YOLOv12 训练从这里开始&#xff1a;LabelImg 标注数据集 labelimg https://github.com/tzutalin/labelImg sudo apt-get install pyqt5-dev-tools pip3 install lxml git clone https://github.com/tzutalin/labelImg.git cd labelImg 开始编译 make…

Day2:前端项目uniapp壁纸实战

先来做一个轮番图。 效果如下&#xff1a; common-style.css view,swiper,swiper-item{box-sizing: border-box; } index.vue <template><view class"homeLayout"><view class"banner"><swiper circular indicator-dots autoplay…

SAP-ABAP:ABAP `LEAVE LIST-PROCESSING` 深度解析

ABAP LEAVE LIST-PROCESSING 深度解析 核心机制 模式切换(Dialog → List) 中断屏幕流 强制终止当前Dialog程序的PBO/PAI处理,脱离屏幕序列控制(如事务码SE38执行的程序)。触发报表事件 激活类报表程序的事件链:INITIALIZATION → AT SELECTION-SCREEN → START-OF-SEL…

在PyTorch中使用GPU加速:从基础操作到模型部署

本文将通过具体代码示例&#xff0c;详细介绍如何在PyTorch中利用GPU进行张量计算和模型训练&#xff0c;包含设备查询、数据迁移以及模型部署等完整流程。 1. 查看GPU硬件信息 使用 nvidia-smi 命令检查GPU状态和进程信息&#xff1a; # 查看GPU信息 !nvidia-smi 输出示例&…

lib-zo,C语言另一个协程库,dns协程化, gethostbyname

lib-zo,C语言另一个协程库,dns协程化, gethostbyname 另一个 C 协程库 https://blog.csdn.net/eli960/article/details/146802313 本协程库 支持 DNS查询 协程化. 禁用所有 UDP 协程化 zvar_coroutine_disable_udp 1;禁用 53 端口的UDP 协程化 zvar_coroutine_disable_ud…

Java第三节:新手如何用idea创建java项目

作者往期文章&#xff1a; Java第一节&#xff1a;debug如何调试程序&#xff08;附带源代码&#xff09;-CSDN博客 Java第二节&#xff1a;debug如何调试栈帧链&#xff08;附带源代码&#xff09;-CSDN博客 步骤一 ​ 步骤二 ​ 步骤三 创建src文件夹包含main文件&#…

(一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话

最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一个智能对话系统&#xff0c;发现这个组合真的非常强大&#xff0c;而且实现起来并不复杂。今天就来分享一下我的学习过程和一些心得体会&#xff0c;希望能帮到同样在探索这个领域的小伙伴们。 一、 环境搭建&#xff1a;从零…

uniapp地图导航及后台百度地图回显(v2/v3版本)

百度地图申请地址&#xff1a;控制台 | 百度地图开放平台 效果&#xff1a; 1.后台 1.1申请百度地图APi 1.2 引入百度地图 <script type"text/javascript" src"//api.map.baidu.com/api?v3.0&ak自己百度生气apikey"></script> 1.3 v2组…

Java模板方法模式详解

模板方法模式详解 一、模式定义 模板方法模式(Template Method Pattern)定义一个操作中的算法骨架&#xff0c;将某些步骤延迟到子类实现。 二、核心结构 1. 抽象模板类 public abstract class AbstractTemplate {// 模板方法&#xff08;final防止子类覆盖&#xff09;pu…

(5)模拟后——Leonardo的可视化操作

1 引言 经过n天的模拟&#xff0c;模拟结果相信已经到手&#xff0c;但如何进行分析呢。 首先是可视化&#xff0c;可视化方法基本分为两类 基于ENVI-met自带软件Leonardo的可视化操作基于NetCDF的可视化操作 2 模拟结果变量说明 首先&#xff0c;模拟结果会有以下几个文件…

基于YOLO11实例分割与奥比中光相机的快递包裹抓取点检测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏&#xff0c;查看更多内容。 0 引言 项目采用六轴机械臂搭配末端真空吸盘&#xff0c;从无序包裹中抓取想要的包裹。AI算法需要提供各包裹的抓取点的3D坐标与3D姿态。由于快递包裹含…

【学Rust写CAD】31 muldiv255函数(muldiv255.rs)

源码 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

蓝桥云客--团队赛

2.团队赛【算法赛】 - 蓝桥云课 问题描述 蓝桥杯最近推出了一项团队赛模式&#xff0c;要求三人组队参赛&#xff0c;并规定其中一人必须担任队长。队长的资格很简单&#xff1a;其程序设计能力值必须严格大于其他两名队友程序设计能力值的总和。 小蓝、小桥和小杯正在考虑报名…

#Linux内存管理# 假设设备上安装了一块2G的物理内存,在系统启动时,ARM Linux内核是如何映射的?

在ARM Linux系统启动过程中&#xff0c;对2GB物理内存的映射实现分为以下几个关键阶段&#xff1a; 一、设备树解析与内存信息获取 1.设备树定义 物理内存范围通过设备树&#xff08;DTS&#xff09;的memory节点定义&#xff0c;例如&#xff1a; memory60000000 { device_ty…

使用MATIO库读取Matlab数据文件中的多维数组

使用MATIO库读取Matlab数据文件中的多维数组 MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序&#xff0c;展示如何使用MATIO库读取Matlab数据文件中的多维数组。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…

react+antd中做一个外部按钮新增 表格内部本地新增一条数据并且支持编辑删除(无难度上手)

需求背景 做一个可以外部控制新增刷新表格 表格内部可以编辑删除 类似下方需求图 实现过程 因为我实现时有两个这样的表格 所以我的事件里面会有传参用于判断 可忽略传参判断部分 代码中有formatMessage部分为国际化可忽略 <div style{{ marginBottom: 10px, margin…

【深度学习新浪潮】视觉与多模态大模型文字生成技术研究进展与产品实践

一、研究进展 跨模态架构创新 原生多模态模型:微软KOSMOS系列通过统一框架支持文本、图像、语音等多模态输入输出,实现跨模态推理与迁移。例如,KOSMOS-2.5可处理文本密集图像,生成结构化文本描述,并通过重采样模块优化视觉与语言的对齐。混合专家架构:第三代模型(如Deep…

重生之我是去噪高手——diffusion model

diffusion model是如何运作的&#xff1f; 想象一下&#xff0c;你有一张清晰的图片。扩散模型的核心思想分为两个过程&#xff1a; 前向过程&#xff08;Forward Process / Diffusion Process&#xff09;&#xff1a;逐步加噪反向过程&#xff08;Reverse Process / Denois…