CSP-S2025 T4 员工招聘 题解

news/2025/11/25 20:14:32/文章来源:https://www.cnblogs.com/optimist-skm/p/19269841
  • 题意简述:

    有个 01 序列 s,1 表示这一位会做 1 的贡献,0 表示这一位不会做贡献,我们需要对另一个序列 c 进行重拍,当一个位置 i,它的 \(c_i \leq 前面未做贡献的位数\) 时,这一位将不会做贡献,我们需要对于合法的 c 计数。一个序列 c 合法当且仅当 \(贡献和 \ge m\)

  • 思路启发:

    注意到前面的位做出的决策会直接影响后面的位的贡献,所以考虑动态规划,且一定要把当前 做贡献/未做贡献 的位数记录在状态里,方便转移。尝试设出状态 \(f_{i, j}\) 表示考虑到第 i 位,有 j 位没有做贡献的方案数,但是我们发现,当我们下一位填一个 \(c \le j\) 时是好转移的,转移到 \(f_{i + 1, j + 1}\) 即可,但是当下一位填 \(c > j\) 时就显得难以转移,因为我们无法确定选的是哪一个 c,从而无法确定下一个 j 转移时是否存在 \(c > j\),这时我们可以考虑贡献延后计算,当加入一个 \(c \le j\) 时直接转移,而加入一个 \(c > j\) 时忽略选数对我们带来的影响,这些影响会在以后的第一个 j,使得 \(c \le j\),即当 \(j = c\) 时,在考虑它带来的方案数。

  • 状态设计:

    \(f_{i, j, k}\) 表示考虑到第 i 位,有 j 位没有做贡献,前 i 位填的 c 里有 k 个 c 小于当前的 j。

  • 转移设计:

    此时我们设 \(cnt_i = \sum_{j = 1}^{n}[c_j = i],sum_i = \sum_{i = 0}^{n} cnt_i\)
    考虑第 i+1 位填什么:

    \(1^\circ\ s_{i + 1} = 1\)
    \(\ \ \ 1.\) 第 i+1 位填一个 \(c > j\),则 \(f_{i + 1, j, k} \leftarrow [n - sum_j > i - k]\ f_{i, j, k}\)
    \(\ \ \ 2.\) 第 i+1 位填一个 \(c \ge j\),则此时第 i+1 位不会产生贡献,j 将会变成 j+1,所以我们需要对 c=j+1 计算它在前 i 位中的贡献,此时枚举前 i 位中有 t 个 c=j,则有 \(f_{i + 1, j + 1, k + t} \leftarrow (sum_j - k) \times t! \times \binom{i-k}{t} \times \binom{{cnt_{j + 1}}}{t} \times f_{i, j, k}\)

    \(2^\circ\ s_{i + 1} = 0\),此时 j 一定会变成 j+1,则再分讨 c 与 j 的关系意义不大,此时可以直接分讨 c 与 j+1 的关系,这样就可以快速得出需要被统计贡献的数的个数,当然讨论 j,然后分别转移显然也是对的。
    \(\ \ \ 1.\) 第 i+1 位填一个 \(c > j+1\),则 \(f_{i + 1, j + 1, k +t} \leftarrow [n - sum_{j + 1} > i - k - t] \times t! \times \binom{i-k}{t} \times \binom{{cnt_{j + 1}}}{t} \times f_{i, j, k}\)
    \(\ \ \ 2.\) 第 i+1 位填一个 \(c \le j+1\),则 $f_{i + 1, j + 1, k + t} \leftarrow (sum_{j + 1} - k - t) \times t! \times \binom{i - k}{t} \times \binom{cnt_{j + 1}}{t} \times f_{i, j, k} $ (这里 \(sum_{j + 1}\) 需要减 t 的原因是这里我们要算的是可以填在第 i+1 位的 c 的个数,而这里的 t 是填在前 i 位的,所以要减去)

  • 代码展示:

#include "bits/stdc++.h"
//#include "bits/extc++.h"
#define ll long long
#define int long long
#define pii std::pair<int, int> 
#define piii std::pair<int, std::pair<int, int> >
#define tiii tuple<int, int, int>
#define mkp std::make_pair
#define smin(a, b) (a = min(a, b))
#define smax(a, b) (a = max(a, b))
#define eb emplace_back
#define pb push_back
#define fi first
#define se second
#define INF ((int)1e9)
#define oo (1e18)
#define debug() printf("Skmqwq")
#define rep(i, j, k) for (int i = (j); i <= (k); ++i)
#define per(i, j, k) for (int i = (j); i >= (k); --i)
using namespace std;
//using namespace __gnu_pbds;
mt19937_64 Skmqwq(time(0) ^ clock());const int N = 5e2 + 7, P = 998244353;
int n, m, c[N], cnt[N], sum[N], f[2][N][N];
int fac[N], ifac[N], inv[N];
string s;inline int qp(int a, int b) {int ret = 1;while (b) {if (b & 1) ret = ret * a % P;a = a * a % P, b >>= 1;}return ret;
}
inline void init() {fac[0] = 1;rep(i, 1, n) fac[i] = fac[i - 1] * i % P;ifac[n] = qp(fac[n], P - 2);per(i, n, 1) ifac[i - 1] = ifac[i] * i % P;rep(i, 1, n) inv[i] = ifac[i] * fac[i - 1] % P;
}
inline int C(int n, int m) { return fac[n] * ifac[m] % P * ifac[n - m] % P; }
inline int A(int n, int m) { return fac[n] * ifac[n - m] % P; }
inline void add(int &a, int b) { a += b;if (a > P) a -= P;
}signed main() {std::ios::sync_with_stdio(false);   std::cin.tie(0);std::cout.tie(0);cin >> n >> m >> s, s = ' ' + s;init();rep(i, 1, n) cin >> c[i], cnt[c[i]]++;sum[0] = cnt[0];rep(i, 1, n) sum[i] = sum[i - 1] + cnt[i];f[0][0][0] = 1;rep(cur, 0, n - 1) {int i = cur & 1, ii = i^1;rep(j, 0, cur) rep(k, 0, min(cur, sum[j])) f[ii][j][k] = 0;rep(j, 0, cur) rep(k, 0, min(cur, sum[j])) {if (s[cur + 1] == '1') {add(f[ii][j][k], (int)((n - sum[j]) > (cur - k)) * f[i][j][k]);rep(t, 0, min(cur - k, cnt[j + 1])) add(f[ii][j + 1][k + 1 + t], (sum[j] - k) * A(cur - k, t) % P * C(cnt[j + 1], t) % P * f[i][j][k] % P);} else {rep(t, 0, min(cur - k, cnt[j + 1])) {add(f[ii][j + 1][k + t], (int)(n - sum[j + 1] > cur - k - t) * f[i][j][k] % P * A(cur - k, t) % P * C(cnt[j + 1], t) % P);if (sum[j + 1] - k - t < 0) continue;add(f[ii][j + 1][k + 1 + t], (sum[j + 1] - k - t) * f[i][j][k] % P * A(cur - k, t) % P * C(cnt[j + 1], t) % P);}       }}// if (cur == 1) cout << f[ii][]}int ans = 0;// rep(j, 0, n - m) cout << f[0][j][sum[j]] << ' ';rep(j, 0, n - m) add(ans, fac[n - sum[j]] * f[n & 1][j][sum[j]] % P);cout << ans << '\n';return 0;
}

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

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

相关文章

2025 GEO优化公司排名权威榜单解读:浙江四家标杆企业凭何突围?

随着数字经济与实体经济的深度融合,GEO(生成式引擎优化)作为AI时代精准营销、内容创新及服务升级的核心支撑技术,已成为企业提升核心竞争力的关键抓手。近日,基于《2025 生成式引擎生态白皮书》,结合“技术壁垒”…

2025河南自习室加盟攻略:高盈利品牌推荐及选址技巧,5大品牌助你抢占教育风口

2025河南自习室加盟攻略:高盈利品牌推荐及选址技巧,5大品牌助你抢占教育风口一、首选松鼠AI自习室:AI赋能的“盈利增长专家” 作为2025年教育加盟领域的标杆品牌,松鼠AI以“智适应系统+全国3000家线下门店”的成熟…

写给0-1岁的初创公司合伙人(101):天使轮与种子轮融资的条件解锁机制

写给0-1岁的初创公司合伙人(101):天使轮与种子轮融资的条件解锁机制大家好,我是jobleap.cn的小九。在初创公司的早期阶段,融资的本质不是单纯的“拿钱”,而是关于**资源的精准配置与风险的动态管理**。从第一性原理…

Mac Unity 2018.dmg游戏工具 安装步骤 简单易懂教程(附安装包)

Mac Unity 2018.dmg游戏工具 安装步骤 简单易懂教程(附安装包)Unity 2018 是个做游戏和互动内容的工具,装在 Mac 上就能用它来拼画面、写逻辑、调动画,把想法做成能玩的东西。先下载​ 找到 Mac Unity 2018.dmg 文…

[模拟赛]拆分(div)

前言: 之前考过,现在被拿来作为DIV2的T3,给学第、学妹们考。回忆的时候对状态的设计没有太清晰还是写一下吧。 题面描述: 给定一个数 \(n\),你需要输出将 \(n\) 拆分成若干可重无序的二的次幂的方案数。答案对 \(…

102302147傅乐宜作业3

1.指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 内容 由于是爬了好几次的网站,所以不放网页结构了 核心代码 1.单线程点击查看代…

实用指南:苍穹外卖 —— 文件上传和菜品的CRUD

实用指南:苍穹外卖 —— 文件上传和菜品的CRUDpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

AI购物助手与编程新纪元:技术如何重塑生活与工作

标签:AI技术, 编程工具, 人工智能应用, 开源项目最近刷新闻,发现AI领域又炸了,各种新功能和新模型层出不穷,简直让人眼花缭乱。作为一个对技术敏感的人,我忍不住把这些信息整理了一下,分享给大家。先说说ChatGPT…

2025中小学生AI学习机选购核心:5大品牌实测,提分才是硬通货!

2025中小学生AI学习机选购核心:5大品牌实测,提分才是硬通货!“AI学习机真的能提分吗?”这是2025年家长选购教育硬件时最核心的疑问。据中国电子信息产业发展研究院最新调研数据显示,使用AI学习机的中小学生中,68…

深入解析:DNS解析原理及工作流程详解

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

详细介绍:【微服务组件】Springboot结合Dubbo实现RPC调用

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

6000 AI Program Topic 3~6

Topic 3 目录 讲解 Python 函数(Functions) 的所有基础与进阶概念,包括:什么是函数、为什么使用函数 内建函数的使用方式 如何自定义函数 函数命名规范 参数(parameters)与参数传递(arguments) 默认参数、多参…

伞兵天降 最小路径覆盖

真实顶点数-最大匹配数 #include <bits/stdc++.h> using namespace std; int a,b; int idx=0;int h[125];int visited[125];int match[125]; struct node {int v,n; }e[1445]; void add(int u,int v) {e[++idx]=…

Linux 通用软件包 AppImage 打包详解

近水楼台先得月,向阳花木易为春。导航格式介绍 - AppImage 手动打包 - appimagetool 自动打包 - linuxdeploy 杂七杂八格式介绍 - AppImage AppImage 是 Linux 系统中一种新型的软件包格式,它与 rpm、deb 这些软件包…

怎么理解np.array([10, 20]).reshape(-1, 1)?

非常好的问题!np.array([10, 20]).reshape(-1, 1) 是 NumPy 中将一维数组转为列向量的常用写法。 下面我将从 基本用法、-1 的含义、与 [:, None] 的对比、常见场景 四个方面,彻底讲清楚 reshape 怎么用,尤其是这种…

2025年11月机器人油脂公司推荐榜:五大专业润滑解决方案供应商对比分析

在工业自动化与机器人技术快速发展的今天,机器人油脂作为保障设备稳定运行的核心耗材,其选择直接影响设备寿命与生产效率。许多设备管理人员、采购负责人或企业技术决策者,常常面临如何从众多供应商中筛选出兼具产品…

2025年11月机器人油脂公司推荐榜:五家优质企业深度对比与客观评价

随着工业自动化程度不断提升,机器人应用场景日益广泛,对机器人油脂品质要求也愈加严格。作为设备维护的关键环节,选择合适的机器人油脂供应商成为众多工业企业技术负责人的核心需求。根据中国机械工业联合会发布的行…

11月25号

今天进行了工程实训中关于钳工的学习。

深入解析:网络安全等级保护测评高风险判定实施指引(试行)--2020与2025版对比

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

AI学习机值不值?2025年实测最有用的AI学习机品牌推荐!

AI学习机值不值?2025年实测最有用的AI学习机品牌推荐!2025年AI学习机市场规模已突破800亿元,但“智商税”的争议始终未停。不少家长困惑:动辄数千元的设备到底有没有用?实则据艾媒咨询2025年第一季度数据显示,使…