当前位置: 首页 > news >正文

P14364 [CSP-S 2025] 员工招聘

怎么看了题解之后认为我是智障啊。


  • \(s_i=0\) 则随便选,扔到未知的垃圾桶里。

  • \(s_i=1\) 则有两种情况,设当前有 \(x\) 个人被扔到垃圾桶里了。

    • \(c_i>x\) 则是成功的
    • \(c_i\le x\) 则扔到垃圾桶里

然后这俩东西可以转化成一个就是把 \(c_i>x\) 看成 \(c_i\le x\) 那么方案数就是要减去的。

\(f_{i,j,k}\) 表示对于前 \(i\) 个数,有 \(j\) 个人在垃圾桶,有 \(k\) 个人确定位置。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
// char buf[1 << 21], *p1 = buf, *p2 = buf;
#define scin static inline
#define per(i, a, b) for (int i = a, END##i = b; i >= END##i; i--)
#define rep(i, a, b) for (int i = a, END##i = b; i <= END##i; i++)
typedef vector<int> vi;
typedef unsigned long long ull;
typedef pair<int ,int> pii;
typedef pair<ll, ll> pll;
// #define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
// #define getchar() gc()
template <typename T> scin void rd(T& s) {s = 0; char ch = getchar(); bool fu = 0;while (ch < '0' || ch > '9') ch == '-' ? fu = 1 : 0, ch = getchar();while (ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();s = fu ? -s : s;
}template <typename T, typename...Args> scin void rd(T& s, Args& ...args) {rd(s), rd(args...);}
template <typename T> scin bool updmin(T& a,T& b) {return a > b ? a = b, true : false;}
template <typename T> scin bool updmax(T& a,T& b) {return a < b ? a = b, true : false;}
template <typename T> scin void updmod(T& a) {a >= mod ? a -= mod : 0;}
template <typename T> scin T updmod(T a,T b) {return a + b >= mod ? a + b - mod : a + b;}const int N = 510;
int f[N][N][N], n, m, c, rk[N], fac[N];
char s[N];
// 对于前 i 个数,已经有 j 个在垃圾桶,k 个确定位置
void Solve() {fac[0] = 1;for (int i = 1; i < N; ++i) fac[i] = 1ll * fac[i - 1] * i % mod;rd(n, m);cin >> s + 1;for (int i = 1, c; i <= n; ++i) rd(c), ++rk[c];for (int i = 1; i <= n; ++i) rk[i] += rk[i - 1];f[0][0][0] = 1;for (int i = 0; i < n; ++i) {if (s[i + 1] == '0') {for (int j = 0; j <= i; ++j)for (int k = 0; k <= i; ++k)(f[i + 1][j + 1][k] += f[i][j][k]) %= mod;} else {for (int j = 0; j <= i; ++j)for (int k = 0; k <= i; ++k) {(f[i + 1][j][k] += f[i][j][k]) %= mod;int x = rk[j] - k;(f[i + 1][j][k + 1] -= 1ll * x * f[i][j][k] % mod) %= mod;(f[i + 1][j + 1][k + 1] += 1ll * x * f[i][j][k] % mod) %= mod;}}}int ans = 0;for (int j = 0; j <= n - m; ++j)for (int k = 0; k <= n; ++k)(ans += 1ll * f[n][j][k] * fac[n - k] % mod) %= mod;cout << (ans + mod) % mod << "\n";
}signed main() {// freopen("input.in", "r", stdin);// ios::sync_with_stdio(false);// cin.tie(0), cout.tie(0);int T = 1;// rd(T);while (T--) Solve();return 0;
}
http://www.jsqmd.com/news/1407093/

相关文章:

  • Windows 10磁盘分区实战:安全从C盘划分D盘,实现系统与数据分离
  • 2026年国内耐用PVC车丝割缝管厂家推荐及选购指南 - 产品推荐官
  • Windows 11文件后缀名修改全攻略:从显示到批量修改与安全关联
  • C++的学习第三部分
  • DrawingBench: Evaluating Spatial Reasoning and UI Interaction Capabilities of Large Language Mode...
  • OpenSSH 7.4到8.9p1安全升级:编译安装与生产环境平滑迁移指南
  • 全屋定制五金怎么选?扎实五金决定长期使用体验 - 米諾
  • Maxwell-Pro 测试系统完整实现
  • 2026北京宝格丽包包回收升温,经典款成闲置变现“硬通货” - 好物循环记
  • Win11系统盘瘦身实战:安全迁移桌面到D盘,释放C盘空间
  • 球面上的测地线
  • 企业本地获客需求 连云港GEO优化服务商优质推荐 - 招财兔数字员工
  • Java网络编程中Connection Reset异常的深度解析与实战排查指南
  • 2026年寄行李箱按体积还是重量收费?一文讲清计费规则,避开被坑! - 快递物流资讯
  • 一天一个halcon案例(2)
  • JavaScript 开发者快速上手 Vue 3 教程
  • GNSS 前世今生
  • 从零到一:休闲游戏合集平台的开发实践
  • 从PE启动盘制作到UEFI引导修复:手把手解决Windows系统无法启动问题
  • 2026年七夕鲜花同城配送全攻略:选品技巧、避坑指南、靠谱平台推荐 - 榜单测评
  • 从Manus看AI Agent云端沙箱:技术演进与底层实现解析
  • Linux GPIO驱动开发:从gpio_set_value()看内核实现与实战优化
  • Windows 10磁盘分区实战:从C盘告急到高效管理,系统自带工具全解析
  • 依托 AI 导出鸭搭建转换链路,高效处理 ChatGPT 生成的文本到 word 中格式混乱问题
  • 基于OpenClaw与iCloud构建智能物品遗忘检测系统
  • OpenCore黑苹果引导:从原理到实战的完整配置指南
  • 铸造领域树脂砂轮|金利威多场景解决方案,20 + 配方覆盖全需求
  • Windows本地硬盘安装CentOS 7:无需U盘的UEFI双系统部署指南
  • Table as a Modality for Large Language Models
  • Linux---网络--应用层协议HTTP(一)