题解:CF2025E Card Game

news/2025/1/12 22:54:03/文章来源:https://www.cnblogs.com/ccxswl/p/18544421

在这

权当卡特兰数的复习题吧。不会卡特兰数的可以先看文末。


如果没有花色 \(1\) 这道题就很简单了,对于每个别的花色都有 \(C(m)\) 种分配方案。\(C(n)\) 表示卡特兰数的第 \(n\) 项,答案就是乘起来。

发现除了花色 \(1\) 每种花色的牌都是独立的。这启示我们枚举每种牌用了多少张花色 \(1\)。设 \(f_{i,j}\) 表示前 \(i\) 种花色的牌用了 \(j\) 张花色 \(1\) 能使第一名玩家获胜的方案数。

有转移:

\[f_{i,j}=\sum_{k\le j} f_{i-1,j-k} \times H(k) \]

枚举的 \(k\) 的含义为第 \(i\) 个花色用了 \(k\) 张花色 \(1\)。其中 \(H(k)\) 表示用了 \(k\) 张花色 \(1\) 的分配方案。

\(H(k)\) 的计算也是简单的,考虑卡特兰数的经典问题,不能经过直线 \(y=x\) 的方格路计数(如果不会可以看文末)。我们先得到了 \(k\) 张极大的牌,可以看做在网格中先向右走了 \(k\) 步,那问题就成了从 \((0,k)\) 走到 \((\frac{m+k}{2},\frac{m+k}{2})\) 且不能经过直线 \(y=x\) 的方案数。

答案就是:

\[H(k)={m \choose \frac{m+k}{2}}-{m\choose\frac{m+k}{2}+1} \]

至此,已经解决大部分问题了,最后就是解决花色 \(1\) 的分配。上面的问题是 \(m\) 张牌中需要先拿出 \(k\) 张与花色 \(1\) 匹配,而现在的问题是 \(m\) 张花色 \(1\) 需要拿出若干张与其他牌匹配,发现问题是一样的,统计答案时乘上 \(H(k)\) 就好了,这里的 \(k\) 表示有 \(k\) 张花色 \(1\) 被用来与其他花色的牌匹配。

复杂度为 \(O(n^3)\),如果你是大常数选手就会 TLE,有一个优化是 \(\frac{m+k}{2}\) 为整数的状态才合法,加上这个就不卡常了。

#include <bits/stdc++.h>using namespace std;const int maxN = 1e3 + 7, mod = 998244353;int fc[maxN], ifc[maxN];
int ksm(int a, int b = mod - 2) {int res = 1;while (b) {if (b & 1)res = 1ll * res * a % mod;a = 1ll * a * a % mod;b >>= 1;}return res;
}int n, m;int C(int n, int m) {if (n < 0 || m < 0 || n < m) return 0;return 1ll * fc[n] * ifc[m] % mod * ifc[n - m] % mod;
}
int H(int k) {auto res = C(m, (m + k) / 2) - C(m, (m + k) / 2 + 1);res += res < 0 ? mod : 0;return res;
}int f[507][507];signed main() {ios::sync_with_stdio(false), cin.tie(nullptr);cin >> n >> m;fc[0] = 1;for (int i = 1; i <= m * 2; i++)fc[i] = 1ll * fc[i - 1] * i % mod;ifc[m * 2] = ksm(fc[m * 2]);for (int i = m * 2 - 1; i >= 0; i--)ifc[i] = 1ll * ifc[i + 1] * (i + 1) % mod;f[1][0] = 1;for (int i = 2; i <= n; i++)for (int j = 0; j <= m; j++)for (int k = (m & 1); k <= j; k += 2)f[i][j] = (f[i][j] + 1ll * f[i - 1][j - k] * H(k) % mod) % mod;int ans = 0;for (int k = 0; k <= m; k++)ans = (ans + 1ll * f[n][k] * H(k) % mod) % mod;cout << ans << '\n';
}

卡特兰数可以解决这类问题:有一个大小为 \(n\times n\) 的方格图左下角为 \((0, 0)\) 右上角为 \((n, n)\) ,从左下角开始每次都只能向右或者向上走一单位,不走到对角线 \(y=x\) 上方(但可以触碰)的情况下到达右上角有多少可能的路径?(摘自 OI Wiki)

答案就是所有的路径数减去不合法的路径数,发现不合法的路径一定经过直线 \(y=x+1\)。对于经过 \(y=x+1\) 且终点为 \((n,n)\) 的路径,在它第一次接触 \(y=x+1\) 后,把它的所有运动反向,向右走变为向上走,向上走变为向右走,最后它一定会到达 \((n-1,n+1)\)

下图中的橙色虚线和粉色虚线是不合法的路径。

可以得出 \(C(n)\) 为从 \((0,0)\)\((n,n)\) 的路径数减从 \((0,0)\)\((n-1,n+1)\) 的路径数。

所以:

\[C(n)={2n\choose n}-{2n\choose n+1} \]

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

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

相关文章

应用网关的演进历程和分类

网关作为互联网流量的入口,其形态也在跟随软件架构持续演进迭代中。我们下面就聊一聊网关的演进历程以及在时下火热的 AI 浪潮下,网关又会迸发怎样新的形态。作者:耿蕾蕾(如葑) 唯一不变的是变化,在现代复杂的商业环境中,企业的业务形态与规模往往处于不断变化和扩大之中…

Vue网站发布到iis后提示404页面不可访问

vue重定向和跨域配置:https://zhuanlan.zhihu.com/p/5306882511.安装组件:URL Rewrite:https://www.iis.net/downloads/microsoft/url-rewriteApplication Request Routing:https://www.iis.net/downloads/microsoft/application-request-routing2.新建一个web.config 放到…

fastadmin 数据记录行上添加操作按钮并设置权限

1. 一键 curd 以及配置菜单 编写控制器方法 - 业务逻辑 再次一键生成菜单 - 生成刚刚写审核通过方法的控制器。 2. 自定义控制器中方法。 3. 查看角色组的权限,并授予该角色权限。 4. 前端修改 index 页面,因为需要权限所以需要加上一句话data-operate-log="{:$auth-&g…

10 倍性能提升, GraalVM 应用可观测实践

ARMS 发布了支持 GraalVM 应用的 Java Agent 探针,可为 GraalVM 应用提供开箱即用的可观测能力。作者:铖朴、层风 GraalVM 静态编译 背景介绍 随着云原生浪潮的蓬勃发展,利用云原生技术为企业应用提供极致的弹性能力是企业数字化升级的核心诉求。但 Java 作为一种解释执行+运…

日立移动硬盘插在电脑有异响数据恢复

当日立移动硬盘插在电脑上出现异响且数据无法读取时,这通常表明硬盘可能遇到了某些问题。以下是一些建议的解决步骤和数据恢复方法: 一、异响原因排查 供电不足: 移动硬盘需要足够的电力供应才能正常工作。如果电脑的USB接口供电不足,可能会导致移动硬盘发出异响且无法读取…

辣椒销售策略:智慧应对顾客,洞悉销售真谛

售卖辣椒的商贩常常面临这样的询问:“你的辣椒辣不辣?”回答这个问题时,他们面临两难:若答辣,怕辣之人即刻离去;若答不辣,或许又错失了喜辣的顾客,交易依旧难以达成。 某日闲暇,我驻足于一位售卖辣椒的妇人三轮车旁,好奇她如何解决这一逻辑悖论。 见暂无顾客,我自以…

idea无法打开:Cannot collect JVM options

idea报错:Cannot collect JVM options Caused by: 0: Cannot read:"C:\\Program Files(x86)\\新建文件夹\\jetbra-ded4f9dc4fcb60294b21669dafa90330f2713ce4\jetbra vmoptionsllidea.vmoptions" 1:stream did not contain valid UTF -8 划重点,错误信息提示流没…

Spring boot HibernateJPA CRUD

连接数据库和创建表 1. pom安装<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifact…

GitLab 中文版如何禁止从 UI 上下载代码?

本文分享如何通过配置来禁止用户从 GitLab 中文版 UI 界面上下载源代码。 GitLab 中文版也就是极狐GitLab,使用界面和 GitLab 一样。常规下载代码的方式也一样,要么使用 SSH 或者 HTTP 克隆,要么直接从 UI 上下载源代码:但是有些企业不想让员工从这个界面上通过下载源代码的…

交换机

$Never\ Give\ Up$

在webstorm里面使用prettier

1. 安装 Prettier bash复制代码 npm install --save-dev prettier2. 创建 Prettier 配置文件 在项目根目录下创建一个 .prettierrc 文件来定义 Prettier 的代码风格规则。以下是一个简单的 Prettier 配置文件示例: json复制代码{"semi": false, // 不…

Delphi通过ODBC连接到GBase 8s数据库

Delphi通过ODBC连接到GBase 8s数据库作者: liaosnet时间: 2021-12-27分类: 默认分类,运维管理阅读:2615 次测试使用Delphi连接到GBase 8s数据库,使用的是ODBC连接方式。 1)、安装ODBC驱动(CSDK) 通过地址https://gbasedbt.com/dl/odbc/GBase8s_3.0.0_1-Win32-ODBC-Driver.z…