牛客练习赛64 D.宝石装箱

Description

\(n\)颗宝石装进\(n\)个箱子使得每个箱子中都有一颗宝石。第\(i\)颗宝石不能装入第\(a_i\)个箱子。求合法的装箱方案对\(998244353\)取模。

两种装箱方案不同当且仅当两种方案中存在一颗编号相同的宝石装在不同编号的箱子中。

\(n\le 8000\)

题解:

直接计算肯定不好做,考虑用容斥来做

令\(g_x\)为\(n\)个宝石中\(x\)个宝石放在不合法的位置的方案数

那么我们的答案可以用容斥表示为\(\sum_{i=0}^{n}(-1)^i\cdot g_i\cdot (n-i)!\)

其中\(g_i\cdot (n-i)!\)可以表示为至少选择\(i\)个宝石放在不合法的位置的方案数,其中必然会出现重复计数,比如固定了\(1,3\)不合法然后在后面随意放置的情况下\(2\)放在了不合法位置,和固定了\(1,2\)不合法然后在后面随意放置的情况下\(3\)放在了不合法位置,所以这里要利用容斥去解决

现在考虑如何计算\(g_x\)

可以令\(g[i][j]\)表示:只考虑前\(i\)个箱子的情况下,有\(j\)个宝石放在不合法的位置的方案数,\(A[i]\)表示有多少个宝石放在第\(i\)个箱子是不合法的

转移方程:\(g[i][j]=g[i-1][j] + g[i-1][j-1]\cdot A[i]\)

其中\(g[i][0]=1\)

也就是说当前这\(j\)个不合法的位置可能有两种方式得到:

  1. \(j\)个不合法的宝石都放在箱子\(1—i-1\)之间
  2. \(j-1\)个不合法的宝石放在在箱子\(1—i-1\)之间,还有一个不合法的宝石在\(i\)这个箱子中

最后得到的\(g[n][j]\)就是\(g_x\)

这个状态转移方程都是从上一层得到的,可以内存优化,只用一维数组

  1. //#pragma GCC optimize("O3")
  2. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
  6. typedef long long int LL;
  7. const LL MOD = 998244353;
  8. const int MAXN = 8e3+7;
  9. LL n,f[MAXN],A[MAXN],g[MAXN];
  10. int main(){
  11. ____();
  12. f[0] = 1;
  13. for(int i = 1; i < MAXN; i++) f[i] = f[i-1] * i % MOD;
  14. cin >> n;
  15. for(int i = 1; i <= n; i++){
  16. int x; cin >> x;
  17. A[x]++;
  18. }
  19. // g[i][x]: 前i个盒子x个不合法的case
  20. // ret = sigma_{x=0}^{n} (-1)^x * g[x] * (n-x)!
  21. g[0] = 1;
  22. for(int i = 1; i <= n; i++) for(int j = i; j >= 1; j--) g[j] = (g[j] + g[j-1] * A[i]) % MOD;
  23. LL ret = 0;
  24. for(int i = 0, j = 1; i <= n; i++, j *= -1) ret = (ret + j * g[i] * f[n-i]) % MOD;
  25. cout << (ret+MOD)%MOD << endl;
  26. return 0;
  27. }

牛客练习赛64 D【容斥+背包】的更多相关文章

  1. 牛客练习赛64 如果我让你查回文你还爱我吗 线段树 树状数组 manacher 计数 区间本质不同回文串个数

    LINK:如果我让你查回文你还爱我吗 了解到了这个模板题. 果然我不会写2333... 考试的时候想到了一个非常辣鸡的 线段树合并+莫队的做法 过不了不再赘述. 当然也想到了manacher不过不太会 ...

  2. 牛客练习赛64 红色的樱花 exgcd 贪心

    LINK:The red sakura 暴怒狂樱 血染京都. 这题质量不咋地 这题也没啥营养. 不过还是存在值得学习的地方的. 一个trick n行 m列 第一行与第n行相连 第1列和第m列相连的时候 ...

  3. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  4. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  5. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  6. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  7. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  8. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  9. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

随机推荐

  1. Linux服务器下安装Composer 并使用Composer安装Thinkphp5.0

    Composer官方文档:https://docs.phpcomposer.com/00-intro.htmlComposer是一个php的包管理器.要求php版本在5.3以上. 一.安装Compos ...

  2. 【JavaWeb】Filter 过滤器

    Filter 过滤器 简介 Filter 过滤器是 JavaWeb 三大组件之一 Filter 过滤器是 JavaEE 的规范,也就是接口 Filter 过滤器的作用是 拦截请求,过滤响应 拦截请求的 ...

  3. dotnet高性能buffer

    1 前言 我曾经写过<杂谈.netcore的Buffer相关新类型>的博客,简单介绍过BinaryPrimitives.Span<>,Memory<>,ArrayP ...

  4. ubuntu 上搭建 go的开发环境 vscode

    原文链接: https://astaxie.gitbooks.io/build-web-application-with-golang/zh/01.4.html 原本我是在windows下进行go的环 ...

  5. 【Linux】md5sum 生产所有文件的md5值,并对照目标文件是否相同

    现在加入有很多很多文件需要测试md5,想看下是否都传输成功了,如何批量生成文件的md5并且逐条对照呢? 下面来简单介绍下 md5sum这个命令有一个选项"-c" 这个选项的意思是c ...

  6. 单线程的as-if-serial语义

    单线程的as-if-serial语义 关于指令重排序有个问题不明白的一个问题 int a = 2; int c = 1 + a; float b = 3f / 2f; 举个栗子,从CPU的设计者以及编 ...

  7. 全球城市ZoneId和UTC时间偏移量的最全对照表

    前言 你好,我是A哥(YourBatman). 如你所知,现行的世界标准时间是UTC世界协调时,时区已不直接参与时间计算.但是呢,城市名称or时区是人们所能记忆和容易沟通的名词,因此我们迫切需要一个对 ...

  8. qt for webassembly环境搭建图文教程

    一.前言 从Qt5.14开始,官方的在线安装提供了qt for webassembly构建套件,这对很多小白来说绝对是个好消息,也绝对是个好东西,好消息是不用再去交叉编译自己生成qt for weba ...

  9. 转 3 jmeter的两种录制方法

      录制1-badboy(推荐) badboy是一款自动化测试工具,它可以完成简单的功能测试和性能测试.其实它是一款独立的测试工具,只不过它录制东西导出的格式适用于jmeter,所以我们经常把jmet ...

  10. javascript通过递归改子节点数据-用于层级深度未知的树形结构

    最近在做这么个需求:树形结构,层级深度未知,一旦某个节点的状态是置灰的话,其所有子节点都要置灰. 方案一(数据库有值):如果数据库里置灰节点的所有子节点,值也都是"置灰",那后台取 ...