[BZOJ4665] 小 w 的喜糖

news/2025/1/4 11:42:59/文章来源:https://www.cnblogs.com/YzaCsp/p/18646328

思路

坏了这次没啥思路

转化题意, 求存在多少种数列 \(B\) , 使得 \(B\)\(A\) 中, 每种元素出现的次数相同并且满足 \(A_i \neq B_i\)
是这样转化的吗

你考虑直接算, 但是这样无论如何你要记录每种元素当前的出现次数作为状态, 不可能啊
怎么做比较方便? 看下标签发现可以使用「二项式反演」

你考虑到「钦定」\(k\) 个位置出现的元素不同不好处理, 考虑常见转化, 转化成「钦定」\(k\) 个位置出现的元素相同

「钦定」\(n - k\) 个元素相同的方案数我们记为 \(f(k)\)
考虑 \(f(k)\) 的计算, 显然需要对于每种颜色处理
\(n - k\) 个元素分给 \(m\) 种颜色让人联想到背包问题, 那么我们考虑 \(\rm{dp}\) 去做
具体的, 你「钦定」\(n - k\) 个元素相同, 其他的随意排列即可

\(dp_{i, j}\) 表示考虑前 \(i\) 种颜色,「钦定」\(j\) 个位置与原序列相同 (序列初始顺序与答案无关, 视作按颜色排序) 时对于相同部分可能的方案数, 记 \(c_i\) 表示颜色 \(i\) 的元素个数

有转移

\[dp_{i, j} = \sum_{k = 0}^{\min(c_i, j)} dp_{i - 1, j - k} {c_i \choose k} \]

然后你发现剩下的情况是多重集的排列, 所以容易发现

\[f(k) = dp_{m, n - k} \cdot \frac{k!}{(c_i - k_i)!} \]

这个 \(\rm{dp}\) 时处理即可

常见套路

\[f(k) = \sum_{i = 0}^{k} {n - i \choose n - k} g(i) \iff g(k) = \sum_{i = 0}^{k} (-1)^{k - i} {n - i \choose n - k} f(i) \]

代码

#include <bits/stdc++.h>
using namespace std;#define QwQ01AwA return 0
#define ll long long
#define look_time cerr << 1.0 * clock() / CLOCKS_PER_SEC << '\n'
template <typename T> void ckmax(T &x, T y) {x = max(x, y);}
template <typename T> void ckmin(T &x, T y) {x = min(x, y);}const int N = 2005;
const int mod = 1e9 + 9;
int ksm(int a, int b) {int ans = 1;for (; b; b >>= 1, a = 1ll * a * a % mod) {if (b & 1) ans = 1ll * ans * a % mod;}return ans;
}
int n;
int siz[N], f[N], g[N];
int fac[N], inv[N];void init(int n) {fac[0] = 1;for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % mod;inv[n] = ksm(fac[n], mod - 2);for (int i = n; i >= 1; i--) inv[i - 1] = 1ll * inv[i] * i % mod;
}
int C(int n, int m) {return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod;
}signed main() {ios::sync_with_stdio(0);cin.tie(0);init(2000);cin >> n;for (int i = 1, x; i <= n; i++) cin >> x, siz[x]++;f[0] = 1;for (int i = 1; i <= n; i++) {if (!siz[i]) continue;memset(g, 0, sizeof(g));for (int j = 0; j <= n; j++) {if (!f[j]) continue;for (int k = 0; k <= siz[i]; k++) {g[j + k] = (g[j + k] + 1ll * C(siz[i], k) % mod * inv[siz[i] - k] % mod * f[j] % mod) % mod;g[j + k] = (g[j + k] % mod + mod) % mod;}}memcpy(f, g, sizeof(f));}int ans = 0;for (int i = 0; i <= n; i++) ans = (ans + ((n - i) % 2 ? -1 : 1) % mod * 1ll * f[n - i] % mod * fac[i] % mod) % mod;cout << ans << '\n';QwQ01AwA;
}

总结

\(\rm{dp}\)\(f\) 其实挺常见的

首先发现只能处理相同元素, 需要分配
背包处理分配问题是常见的

「钦定」意义下, 「至多」和「恰好」的转化

第一次见到组合数学中「多重集的排列」

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

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

相关文章

中考英语优秀范文-005 What will you do for Mum? 你将为妈妈做些什么?

1 写作要求 天下最伟大的爱就是母爱。假设你是李静,母亲节就要到了,你们班将举办以What will you do for Mum? 为题的英语演讲比赛。请你准备一篇80词左右的演讲稿参加比赛。 2 优秀范文 What will you do for Mum? Hello, class. I’m Li Jing. Mother’s Day is coming. …

Notes.js的安装和配置

一、安装 1、下载 https://nodejs.org/en/download/ 2、安装 3、测试 打开cmd 查看node 和npm 版本node -vnpm -v 二、环境配置 1、找到安装目录,新建 node_cache 和 node_global文件夹 2、以管理员权限打开cmd 输入npm config set prefix "D:\nodejs\node_global"…

本地大模型初体验

前言 近几年这个话题很火,但是我一直没得去尝试一下,今天突然来兴趣想试试,然后就出来了这一篇文档。 环境准备docker安装管理工具 Ollama是一款开源的大模型管理工具,它允许用户在本地便捷地运行多种大型开源模型,包括清华大学的ChatGLM、阿里的千问以及Meta的llama等。目…

Linux装逼玩法之wttr.in天气

什么是 wttr.in? wttr.in 是一个基于 Web 的命令行天气服务,由 Igor Chubin 开发。它通过调用OpenWeatherMap 等天气服务的 API,提供了简洁、直观的天气信息展示。 Linux使用Curl命令可快速获取天气信息查询指定城市的天气[Wed Jan 01 20:38:53 root@localhost ~ ]# curl wt…

vmware下载安装配置

vmware下载安装配置 下载 https://www.vmware.com/ # 官网 https://www.broadcom.com/ # Broadcom官网 https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion # VMware官网虚拟机下载页 https://www.filehorse.com/download-v…

软件安全测试

一、网络协议基础 1、网络模型 我们把一些过程封装到一起,称为“模型”,如下:把北京中的4个步骤封装到一起,就是1个模型了。 (1)网络模型-OSI OSl(Open System Interconnection 开放系统互联)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体…

开拓计划21/2025集训作业表3 - 倍增ST表LCA次小生成树

开拓计划21/2025集训作业表3 - 倍增&ST表&LCA&次小生成树 倍增&ST表 概念Q:倍增是什么? A:倍增,顾名思义是成倍增长的意思,它利用了二进制的性质和预处理(俗称打表)的思想,在 \(O(\log n)\) 内完成一些操作。 Q:ST表是什么? A:ST表主要用于解决RMQ(…

系统管理体系之进程管理

系统管理体系之进程管理 1. 进程名字 含义程序 安装包,程序代码,app,存放在磁盘上面.进程⭐️ 运行起来的程序,命令,服务(远程连接服务,网络服务)都可以称作进程。 运行在内存中。守护进程 守护进程, 一直运行的进程. 也可以叫做服务.2. 进程分类(异常进程) 2.1 僵尸进程⭐️⭐…

系统管理之服务管理---管理命令

1. 系统管理之服务管理---管理命令systemctl 管理服务开机自启动管理正在运行的服务.旧版本的系统:Centos 5.x 6.x 需要使用service 命令检查 sshd 远程连接服务状态systemctl status sshd systemctl status 单个或多个服务名如何设置开启开机自启动 systemctl enable sshd 当…

夜之向日葵

2024 ECF 游记 Day 0 我早就预感到 ecf 要寄,但没想到寄得这么彻底。 比赛之前,我去做了去年 ecf 的题目,发现里面的可做题全部都是贪心,性质和结论题。众所周知,chino 最不擅长的题目类型就是这些。 同时,因为周一周二要考大物和数分,比赛前的一周几乎没有训练。 于是就…

网络流初步

网络流初步(脑部整理) 呜呜呜,家人们也是学上网络流了。 咸鱼起手,你反应得过来吗? 英语不太好(老英不会看窝博客吧) What is 网络流?概述 网络\((network)\)是指一个特殊的有向图 \(G=(V,E)\),其与一般有向图的不同之处在于有容量和源汇点。$E $中的每条边 $ (u, v)$ 都…

金砖技能大赛-内存取证

检材链接 :https://pan.baidu.com/s/1tYgIicCqJExmaMLYa3YeSA 提取码:lulu按照惯例先打印出信息 1.从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位); 先使用lsadump指令看看python2 vol.py -f /文件路径/文件 hashdump最后一个是…