牛客练习赛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\)

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

//#pragma GCC optimize("O3")
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
typedef long long int LL;
const LL MOD = 998244353;
const int MAXN = 8e3+7;
LL n,f[MAXN],A[MAXN],g[MAXN];
int main(){
____();
f[0] = 1;
for(int i = 1; i < MAXN; i++) f[i] = f[i-1] * i % MOD;
cin >> n;
for(int i = 1; i <= n; i++){
int x; cin >> x;
A[x]++;
}
// g[i][x]: 前i个盒子x个不合法的case
// ret = sigma_{x=0}^{n} (-1)^x * g[x] * (n-x)!
g[0] = 1;
for(int i = 1; i <= n; i++) for(int j = i; j >= 1; j--) g[j] = (g[j] + g[j-1] * A[i]) % MOD;
LL ret = 0;
for(int i = 0, j = 1; i <= n; i++, j *= -1) ret = (ret + j * g[i] * f[n-i]) % MOD;
cout << (ret+MOD)%MOD << endl;
return 0;
}

牛客练习赛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. 【Flutter】可滚动组件之ListView

    前言 它可以沿一个方向线性排布所有子组件,并且它也可以支持基于Sliver的延迟构建模型. 接口描述 ListView({ Key key, // 可滚动widget公共参数 Axis scrollD ...

  2. Kubernetes学习笔记之认识Kubernetes组件

    前言:笔记知识点来源于Kubernetes官方文档说明,链接:https://kubernetes.io/docs/concepts/overview/components/ ,本记录仅仅是学习笔记记 ...

  3. Pandas数据分析练手题(十题)

    数据集下载地址:https://github.com/Rango-2017/Pandas_exercises --------------------------------------------- ...

  4. 【Git】4、创建代码仓库,HTTP、SSH拉取远端代码

    拉取远端代码:使用Git命令下载远程仓库到本地 文章目录 拉取远端代码:使用Git命令下载远程仓库到本地 1.创建远程代码仓库 2.创建仓库 3.进入仓库 4.HTTP(S)获取远程仓库 首次拉取 更 ...

  5. 【Linux】iptables的内核模块问题大坑!

    系统环境 CentOS 6.5 今天本来可以平静的度过一天,正品味着下午茶的美好,突然接到防火墙iptables的报警. 进入到服务器中,执行下面的命令查看,结果报错 /etc/init.d/ipta ...

  6. 攻防世界 - Web(三)

    PHP2: 1.进入页面,进行抓包或后台扫描都没有什么发现,然后网上查一波wp,发现是关于.phps文件,进入index.phps,弹出一段代码,查看源代码, <?php if("ad ...

  7. ctfhub技能树—sql注入—Cookie注入

    手注 打开靶机 查看页面信息 查找cookie 测试是否为cookie注入 抓包 尝试注入 成功查询到数据库名 查询表名 查询字段名 查询字段信息 成功拿到flag sqlmap 查询数据库名 pyt ...

  8. C# datagridview设置标题为汉语

    正常情况下,在给datagridview绑定数据源之后,显示的是SQL语句中的栏位,如下 我们想让标题显示汉语,可以有一下两种方法 1.在SQL中设置列别名 SELECT TITLE AS '报警标题 ...

  9. 关于postgresql中numeric和decimal的精度和标度问题

    精度即数的有效数字个数 2.5的有效数字个数是2,但是053.2的有效数字个数是3 标度是小数点的位数 例如numeric(2,1),即这个数必须是两位,并且小数后面最多有一位,多出来的小数会被四舍五 ...

  10. Springmvc中参数的绑定

    .处理器适配器在执行Handler之前需要把http请求的key/value数据绑定到Handler方法形参数上. 1.默认支持的参数类型: HttpServletRequest,HttpServle ...