牛客练习赛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. Debian9 升级至 Debian10

    前言 目前国内云服务商提供的镜像最新只有 9 , 本文讲解升级至 10 的方法 正文 查看当前版本 lsb_release -a No LSB modules are available. Distr ...

  2. Goland 设置代码格式化

    前言 之前一直喜欢 VsCode 的代码自动格式化和其他的一些功能 今天了解到原来 Goland 也有这些功能, 想想也对, 毕竟这么大 正文 Goland设置代码格式化 进入设置,按需选择要使用的, ...

  3. LeetCode662 二叉树最大宽度

    给定一个二叉树,编写一个函数来获取这个树的最大宽度.树的宽度是所有层中的最大宽度.这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空. 每一层的宽度被定义为两个端点(该层 ...

  4. 【译】Async/Await(二)——Futures

    原文标题:Async/Await 原文链接:https://os.phil-opp.com/async-await/#multitasking 公众号: Rust 碎碎念 翻译 by: Praying ...

  5. k8s之ServiceAccount

    导读 上一篇说了k8s的RBAC授权模式,今天就来简单看一下其中涉及到的ServiceAccount. 简介 k8s创建两套独立的账号系统,原因如下: (1)User账号给用户用,Service Ac ...

  6. (十七)logging模块

    logging模块是Python内置的标准模块,主要用于输出运行日志. 简单应用 import logging logging.debug('+++debug+++') logging.info('+ ...

  7. 【Azure Developer】解决Azure Key Vault管理Storage的示例代码在中国区Azure遇见的各种认证/授权问题 - C# Example Code

    问题描述 使用Azure密钥保管库(Key Vault)来托管存储账号(Storage Account)密钥的示例中,从Github中下载的示例代码在中国区Azure运行时候会遇见各种认证和授权问题, ...

  8. [Usaco2002 Feb]Rebuilding Roads重建道路

    题目描述 一场可怕的地震后,奶牛用N个牲口棚(1 <= N <= 150,编号1..N)重建了农民John的牧场.奶牛没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是唯一 ...

  9. watchdog应用实例

    watchdog应用实例 By 鬼猫猫 20130504 http://www.cnblogs.com/muyr/ 实例:监测某文件夹,一旦文件夹里有文件,就把它剪切到其他服务器 import sys ...

  10. SpringCloud Alibaba Nacos注册中心源码浅析

    一.前置了解 1.1 简介 Nacos是一款阿里巴巴推出的一款微服务发现.配置管理框架.我们本次对将对它的服务注册发现功能进行简单源码分析. 1.2 流程 Nacos的分析分为两部分,一部分是我们的客 ...