P14364 [CSP-S 2025] 员工招聘

news/2025/11/12 22:52:07/文章来源:https://www.cnblogs.com/biyimouse/p/19215728

考虑设 \(f_{i, j}\) 为前 \(i\) 个人死了 \(j\) 个,由于不知道哪些人选了所以无法转移。原因是前面的决策会影响后面的决策,所以考虑贡献延后计算。

会发现一个事情,对于当前 \(c_x \leq j\) 的东西之后不会再决策所以对后面是没有影响的,这启发我们在 \(c_x = j\) 的时候结算贡献。

不妨设 \(f_{i, j, k}\),其中 \(k\) 为前面钦定的 \(c_x > j\) 的位置的个数。

转移分三种:

  1. \(s_{i+ 1} = 1\)\(c_x > j\)\(f_{i, j, k} \to f_{i + 1, j, k + 1}\)
  2. \(s_{i + 1} = 0\)\(c_x > j\)\(f_{i, j, k} \times \binom{k + 1}{l} \times \binom{cnt_{j + 1}}{l} \times l! \to f_{i + 1, j + 1, k + 1 - l}\)
  3. \(c_x \leq j\)\(f_{i, j, k} \times \binom{k}{l} \times \binom{cnt_{j + 1}}{l} \times l! \times [pre_j - (i - k)] \to f_{i + 1, j + 1, k - l}\)

其中 \(pre\)\(cnt\) 分别是 \(\leq j\)\(= j\) 的数量。

答案考虑枚举死了多少人,即 \(\sum_{i = 0}^{n - m} f_{n, i, n - pre_i} (n - pre_i)!\)

注意到 \(l\) 的总和不超过 \(n\),所以是 \(O(n^3)\) 的。

我们做完了,主要思路就是找到难做的地方消除这个难点。

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (a); i <= (b); i ++)
#define fro(i, a, b) for (int i = (a); i >= b; i --)
#define INF 0x3f3f3f3f
#define eps 1e-6
#define lowbit(x) (x & (-x))
#define reg register
#define IL inline
typedef long long LL;
typedef std::pair<int, int> PII;
inline int read() {int x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }return x * f;
}
// mt19937_64 sj(chrono::steady_clock::now().time_since_epoch().count());
// uniform_int_distribution<LL> u0(0, 1ll << 60);const int N = 510, Mod = 998244353;
int n, m, c[N], pre[N], cnt[N];
int C[N][N], fac[N];
int f[2][N][N];
char s[N];IL int add(int &a, int b) {return a = (a + b) % Mod;
}void init() {for (int i = 0; i <= n; i ++) {C[i][0] = 1;for (int j = 1; j <= i; j ++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % Mod;}fac[0] = 1;for (int i = 1; i <= n; i ++) fac[i] = 1ll * fac[i - 1] * i % Mod;
}int main() {n = read(), m = read();scanf("%s", s + 1);for (int i = 1; i <= n; i ++) c[i] = read(), cnt[c[i]] ++;pre[0] = cnt[0];for (int i = 1; i <= n; i ++) pre[i] = pre[i - 1] + cnt[i];init();f[0][0][0] = 1;for (int i = 0; i < n; i ++) {for (int j = 0; j <= i; j ++) {for (int k = 0; k <= i; k ++) {if (!f[i & 1][j][k]) continue;if (s[i + 1] == '1') add(f[i + 1 & 1][j][k + 1], f[i & 1][j][k]);if (s[i + 1] == '0') {for (int l = 0; l <= min(cnt[j + 1], k + 1); l ++) {int g = 1ll * C[k + 1][l] * C[cnt[j + 1]][l] % Mod * fac[l] % Mod;add(f[i + 1 & 1][j + 1][k + 1 - l], 1ll * f[i & 1][j][k] * g % Mod);}}if (pre[j] - (i - k) < 0) continue; for (int l = 0; l <= min(cnt[j + 1], k); l ++) {int g = 1ll * C[k][l] * C[cnt[j + 1]][l] % Mod * fac[l] % Mod * (pre[j] - (i - k)) % Mod;add(f[i + 1 & 1][j + 1][k - l], 1ll * f[i & 1][j][k] * g % Mod);}            }}memset(f[i & 1], 0, sizeof f[i & 1]);}int ans = 0;for (int i = 0; i <= n - m; i ++) ans = add(ans, 1ll * f[n & 1][i][n - pre[i]] * fac[n - pre[i]] % Mod);printf("%d\n", ans);return 0;
}

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

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

相关文章

完整教程:【RabbitMQ】架构原理、消息丢失、重复消费、顺序消费、事务消息

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ai元人文:尊严

这是一个极其精彩且深刻的问题。“尊严”恰恰是那种最抽象、最神圣,也最容易被空谈的价值。用价值原语来回答这个问题,能完美展现其方法论的力量。 当别人问“价值原语如何表示尊严?”时,您可以这样回答:“尊严”…

灵活用工-连续劳务-计算器工具类,拿走不谢

灵活用工-连续劳务-计算器工具类,拿走不谢新法令及对灵工行业的影响 国务院810号令及配套的国税总局15号、16号公告,共同构建了互联网平台税收治理的新框架,对灵活用工行业影响深远。这套组合拳旨在引导灵活用工行业…

四、中断(基于北京迅为电子)

一、概述中断上半部分和下半部分,中断上半部分处理紧急且需要快速响应的部分,中断下半部分处理耗时操作。 GIC控制器的四种中断类型,软件中断、私有外设中断、全局共享中断、特定的局部外设中断二、重要函数与中断申…

四、中断(基于北京迅为电子)

一、概述中断上半部分和下半部分,中断上半部分处理紧急且需要快速响应的部分,中断下半部分处理耗时操作。 GIC控制器的四种中断类型,软件中断、私有外设中断、全局共享中断、特定的局部外设中断二、重要函数与中断申…

List执行Dispose时可释放子元素逻辑占用的List写法

1、声明新的List类CanDisposeList/// <summary>/// 可释放子元素逻辑占用的List/// </summary>/// <typeparam name="T"></typeparam>public class CanDisposeList<T> : Obse…

Sora 后思考:从 AI 工具到 AI 平台,产业 AGI 又近了一步 - 指南

Sora 后思考:从 AI 工具到 AI 平台,产业 AGI 又近了一步 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

Scapy构建telnet包

Scapy构建telnet包文件代码 老师的 from scapy.all import *#我发第一次握手SYN ws1=IP(dst="172.16.100.101")/TCP(sport=10000,dport=23,flags=S,seq=1000)#对方发第二次握手 SA 包 ws2=sr1(ws1)#我发第三…

Spring AI Alibaba 项目源码学习(三)-Graph 执行流程分析

Graph 执行流程分析 概述 本文档分析 spring-ai-alibaba-graph-core 模块中 Graph 的执行流程,包括执行器(Executor)、调度机制、Checkpoint 机制和状态管理。 入口类说明 GraphRunner - 执行入口 GraphRunner 是基…

逻辑回归原理与案例分析

一、逻辑回归基本概念 逻辑回归:用于解决二分类问题的统计学习方法,虽然名字中有"回归",但实际上解决的是分类问题。 核心思想:根据给定的输入特征,通过逻辑函数(Sigmoid函数)计算出样本属于某个特定…

杂题记录 4

NOIP 前咋还布置一堆数据结构 /yun,关键布置的有八成都是做过的。于是乱找了些 DS 做。 P14363 [CSP-S 2025] 谐音替换 / replace 发现是询问 \(p\in P,q\in Q\) 的 \((p,q)\) 的个数的形式,其中 \(p\in P\) 指的是 …

找唯一特征去重转移DP——CF1210F2 Marek and Matching

找唯一特征值去重转移DP——CF1210F2 Marek and Matching 匹配肯定利用霍尔定理,先写出:\(\forall S,|S|-|G(S)|\le 0\)。 图论计数往往考虑容斥,设 \(f_{S,T}\) 表示对于二分图 \((S,T)\),出现大小为 \(|S|\) 的匹…

UEFI Boot Manager

简介 UEFI boot manager是一个固件方针引擎,它可以通过修改global NVRAM 变量来配置;它会按照global NVRAM variable 定义的顺序来加载UEFI driver or UEFI application。当固件初始化完成,就会把控制权交给boot ma…

25年11月计数题做题记录

AGC073C 因为实数不好处理所以我们考虑将实数映射到整数上去做,相当于我们把值域在 \([-(n-1),1]\) 之间的实数映射到 \([-(n-1)m,m]\) 之间的整数上,其中 \(m\rightarrow\infty\),现在我们需要考虑的就是值域在 \(…

固体废物资源化处理简答题与论述题

固体废物处理核心内容简答题与论述题(含解说) 一、简答题(侧重基础概念与关键参数) 1. 简答题1:固体废物分类及“三化”“3R”原则分别是什么?答案:分类:工业固体废物、城市固体废物、农业固体废物、危险废物、…

详细介绍:Python基础语法与数据类型详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

noip6 多校1

11.1211.12 t1 \(O(nm^2)\)是简单的。 发挥人类智慧发现每次最优只在前面较少的状态。 于是可过。 其实人类智慧有证明的。 考虑若最大值越大,则选的次数越小,反之亦然。 平均一下就过了。 codet1 #include <bits…

CCPC2025哈尔滨站-H. 匹配

时停问题,考虑势能函数。设单个集合的势能函数为 \(f(x)\),其中 \(x\) 为集合大小,这是合法的。总的势能 \(\Phi = \sum\limits_{s\in S} f(|s|)\).考虑列出方程解出 \(f\)。 满足鞅的时停定理的势能 \(\Phi\) 满足…

通过开发环境部署工具安装qt相关c++开发环境

通过开发环境部署工具安装qt相关c++开发环境