题解:十二重计数法

news/2025/10/26 12:13:30/文章来源:https://www.cnblogs.com/QEDQEDQED/p/19166677

题解:十二重计数法

前置:

  1. 计数基础(组合数,斯特林数)
  2. 多项式基础(多项式 exp)

题面:

\(n\) 个球和 \(m\) 个盒子,要全部装进盒子里。
还有一些限制条件,那么有多少种方法放球?(与放的先后顺序无关)

限制条件分别如下:

\(\text{I}\):球之间互不相同,盒子之间互不相同。
\(\text{II}\):球之间互不相同,盒子之间互不相同,每个盒子至多装一个球。
\(\text{III}\):球之间互不相同,盒子之间互不相同,每个盒子至少装一个球。

\(\text{IV}\):球之间互不相同,盒子全部相同。
\(\text{V}\):球之间互不相同,盒子全部相同,每个盒子至多装一个球。
\(\text{VI}\):球之间互不相同,盒子全部相同,每个盒子至少装一个球。

\(\text{VII}\):球全部相同,盒子之间互不相同。
\(\text{VIII}\):球全部相同,盒子之间互不相同,每个盒子至多装一个球。
\(\text{IX}\):球全部相同,盒子之间互不相同,每个盒子至少装一个球。

\(\text{X}\):球全部相同,盒子全部相同。
\(\text{XI}\):球全部相同,盒子全部相同,每个盒子至多装一个球。
\(\text{XII}\):球全部相同,盒子全部相同,每个盒子至少装一个球。

\(\text{I}\)

容易发现是 \(m^n\),每个球可以任意选。

\(\text{II}\)

枚举哪些不放球,\(C_m^n\)

\(\text{III}\)

因为非空,那么每一种方案每个盒子间都是本质不同的,所以其实就是斯特林数乘阶乘,但是这里给出更为普遍一点的推法。

\(G_i\) 为钦定 \(i\) 个盒子可空方案数,\(F_i\)\(i\) 个盒子不空方案数。

那么:

\[G_i=i^n \]

\[G_i=\sum_{j=0}^i{\binom{i}{j}F_j} \]

\[F_i=\sum_{j=0}^{i}{(-1)^{i-j}\binom{i}{j}G_j} \]

所以答案为:

\[\sum_{j=0}^m{(-1)^{m-i}\binom{m}{i}i^n} \]

\(\text{IV}\)

考虑枚举多少个非空,因为盒子本质不同,所以不需要知道哪些为空。

剩下的盒子见 \(\text{VI}\),所以答案就是 \(\sum_{i=0}^m{n \brace i}\)

\(\text{V}\)

发现交换两个盒子的所有球是相同的方案,所以其实只有一种合法方案。

答案是:\([n\le m]\)

\(\text{VI}\)

这个其实就是将 \(n\) 个本质不同的数划分为 \(m\) 个非空集合的方案数。

观察 \(\text{III}\) 得知,在那个方案数统计中,每一个划分方案都会被计算 \(m!\) 次,所以其实就得到了:

\[{n\brace m}=\sum_{i=0}^m{\frac{(-1)^{m-i}i^n}{i!(m-i)!}} \]

注意到 \(\text{IV}\) 需要求 \(n\brace i\),那么考虑生成函数。

\(F_n=\sum_{i=0}^{+\infty}{{n \brace i}x^i}\)

不过其实就只有 \(n+1\) 项有值。

由刚刚的推导得知:

\[F_n=\sum_{i=0}^{n}{\sum_{j=0}^i{\frac{(-1)^{i-j}j^n}{j!(i-j)!}}x^jx^{i-j}} \]

得到了一个卷积形式:

\[G_n=\sum_{i=0}^{n}{\frac{i^n}{i!}x^i} \]

\[H_n=\sum_{i=0}^{n}{\frac{(-1)^i}{i!}x^i} \]

\[F_n=G_n\times H_n \]

直接 NTT 即可。

\(\text{VII}\)

方案数只与每个盒子内的球数有关,直接插板法,先放 \(m\) 个球在每个里面,\(C_{n+m-1}^{m-1}\)

\(\text{VIII}\)

枚举哪些盒子是空的,\(C_{m}^{n}\)

\(\text{IX}\)

更简单的插板 \(C_{n-1}^{m-1}\)

\(\text{X}\)

假设方案数是 \(p_{n,m}\),那么可以发现其实是在统计有多少种单调不降的序列,所有数的和是 \(n\)

这样一个序列一定是通过若干次前缀加构成的。

每次新加一个数考虑是否进行前缀加:

\[p_{i,j}=p_{i,j-1}+p_{i-j,j} \]

其实进行一些更为朴素的 \(dp\),也可以推得,不过需要推的比较复杂。

但是这是 \(O(n^2)\) 的。

怎么优化呢?

首先现将转移更改一下:

\[p_{i,j}=\sum_{k=0}{p_{i-kj,j-1}} \]

惊奇的发现如果设 \(P_{i}=\sum_{k=0}^{+\infty}{p_{k,i}x^k}\) 可以得到:

\[P_i=P_{i-1}\sum_{k=0}{x^{ik}} \]

那么:

\[P_m=\prod_{i=1}^{m}{(\sum_{k=0}{x^{ik}})}=\prod_{i=1}^m{\frac{1}{1-x^i}} \]

此时多项式求 \(\ln\) 再求 \(\exp\) 可得(\(\ln\) 只需手模泰勒展开或简单求导积分即可):

\[P_m=\exp \sum_{i=1}^m{\sum_{j=0}^{+\infty}{\frac{x^{ij}}{j}}} \]

\(\text{XI}\)

还是 \([n\le m]\)

\(\text{XII}\)

先将 \(m\) 个球放进去,答案是 \(p_{n-m,m}\)

代码:

点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
const int N = 8e5 + 10, mod = 998244353;#define int long long#define emp emplace_back
#define pb push_back
#define fi first
#define se secondusing pii = pair <int, int>;int fac[N], inv[N], s[N], p[N], f[N], g[N];int qpow(int x, int b)
{int res = 1;while (b){if (b & 1) res = res * x % mod;x = x * x % mod;b >>= 1;}return res;
}int rev[N];
void NTT(int *a, int k, bool op = 0)
{for (int i = 0; i < k; i++) rev[i] = (rev[i >> 1] >> 1) | (i & 1 ? k >> 1 : 0);for (int i = 0; i < k; i++) if (i < rev[i]) swap(a[i], a[rev[i]]);for (int len = 2; len <= k; len <<= 1){int wn = qpow(3, (mod - 1) / len);for (int l = 0, mid = (len >> 1) - 1; l + len - 1 < k; l += len, mid += len){int w = 1;for (int i = l; i <= mid; i++, w = w * wn % mod){int x = a[i], y = a[i + (len >> 1)] * w % mod;a[i] = x + y;if (a[i] >= mod) a[i] -= mod;a[i + (len >> 1)] = x - y;if (a[i + (len >> 1)] < 0) a[i + (len >> 1)] += mod;}}}if (op){reverse(a + 1, a + k);int inv = qpow(k, mod - 2);for (int i = 0; i < k; i++) a[i] = a[i] * inv % mod;}
}void fill(int *f, int l, int r, int v) {for (int i = l; i < r; i++) f[i] = v;}void copy(int *f, int *h, int l, int r) {for (int i = l; i < r; i++) h[i] = f[i];}int mulf[N], mulg[N];
void mul(int *f, int *g, int *h, int n, int m)
{int len = 1;while (len < n + m) len <<= 1;fill(mulf, 0, len, 0), fill(mulg, 0, len, 0);copy(f, mulf, 0, len), copy(g, mulg, 0, len);NTT(mulf, len, 0), NTT(mulg, len, 0);for (int i = 0; i < len; i++) h[i] = mulf[i] * mulg[i] % mod;NTT(h, len, 1);for (int i = n + m - 1; i < len; i++) h[i] = 0;
}int invh[N], invf[N];void Inv(int *f, int *h, int n)
{if (n == 1) return h[0] = qpow(f[0], mod - 2), void();Inv(f, h, (n + 1) >> 1);int len = 1;while (len < 2 * n) len <<= 1;fill(invf, 0, len, 0);copy(f, invf, 0, n);NTT(invf, len, 0), NTT(h, len, 0);for (int i = 0; i < len; i++) h[i] = h[i] * (2 - h[i] * invf[i] % mod + mod) % mod;NTT(h, len, 1);fill(h, n, len, 0);
}void dev(int *f, int len) {for (int i = 1; i < len; i++) f[i - 1] = i * f[i] % mod; f[len - 1] = 0;}
void redev(int *f, int len) {for (int i = len - 1; i >= 0; i--) f[i + 1] = f[i] * qpow(i + 1, mod - 2) % mod; f[0] = 0;}int lnf[N], lng[N];void ln(int *f, int *h, int n)
{fill(lnf, 0, 2 * n, 0), fill(lng, 0, 2 * n, 0);copy(f, lnf, 0, n);dev(lnf, n);Inv(f, lng, n);mul(lnf, lng, h, n, n);redev(h, n);fill(h, n, 2 * n, 0);
}int _expf[N], expg[N];void exp(int *f, int *h, int n)
{if (n == 1) return h[0] = 1, void();exp(f, h, (n + 1) >> 1);fill(_expf, 0, 2 * n, 0);fill(expg, 0, 2 * n, 0);copy(h, _expf, 0, n);fill(_expf, n, 2 * n, 0);ln(_expf, expg, n);for (int i = 0; i < n; i++) expg[i] = (-expg[i] + f[i] + mod) % mod;expg[0]++;mul(_expf, expg, h, n, n);fill(h, n, 2 * n, 0);
}// #pragma region countint C(int n, int m) {return n >= m ? fac[n] * inv[m] % mod * inv[n - m] % mod : 0;}int A(int n, int m) {return C(n, m) * fac[m] % mod;}int I(int n, int m) {return qpow(m, n);}int II(int n, int m) {return A(m, n);}int III(int n, int m)
{int flag = m & 1 ? -1 : 1, ans = 0;for (int i = 0; i <= m; i++) ans = (ans + flag * qpow(i, n) % mod * C(m, i) % mod + mod) % mod, flag = -flag;return ans;
}int IV(int n, int m)
{int ans = 0;for (int i = 0; i <= m; i++) ans = (ans + s[m - i]) % mod;return ans;
}int V(int n, int m) {return n <= m;}int VI(int n, int m) {return s[m];}int VII(int n, int m) {return C(n + m - 1, m - 1);}int VIII(int n, int m) {return C(m, n);}int IX(int n, int m) {return C(n - 1, m - 1);}int X(int n, int m) {return p[n];}int XI(int n, int m) {return n <= m;}int XII(int n, int m) {return p[n - m];}// #pragma endregionsigned main()
{// freopen("data.in", "r", stdin); freopen("data.out", "w", stdout);// freopen("mission.in", "r", stdin); freopen("mission.out", "w", stdout);ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);int n, m; cin >> n >> m;fac[0] = inv[0] = 1;for (int i = 1; i <= n + m; i++) fac[i] = fac[i - 1] * i % mod, inv[i] = qpow(fac[i], mod - 2);for (int i = 0; i <= n; i++) f[i] = qpow(i, n) * inv[i] % mod;for (int i = 0; i <= n; i++) g[i] = (i & 1 ? mod - 1 : 1) * inv[i] % mod;mul(f, g, s, n + 1, n + 1);fill(s, n + 1, N, 0);fill(f, 0, N, 0);for (int i = 1; i <= m; i++){for (int j = 1; i * j <= n; j++){(f[i * j] += qpow(j, mod - 2)) %= mod;}}exp(f, p, n + 1);cout << I(n, m) << '\n';cout << II(n, m) << '\n';cout << III(n, m) << '\n';cout << IV(n, m) << '\n';cout << V(n, m) << '\n';cout << VI(n, m) << '\n';cout << VII(n, m) << '\n';cout << VIII(n, m) << '\n';cout << IX(n, m) << '\n';cout << X(n, m) << '\n';cout << XI(n, m) << '\n';cout << XII(n, m) << '\n';return 0;
}

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

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

相关文章

Wyn 商业智能软件:3D 可视化大屏搭建与设备利用全指南

Wyn 商业智能软件:3D 可视化大屏搭建与设备利用全指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

什么是Java Lambda

Java Lambda表达式:实质上是将方法作为参数进行传递,一般是在你需要将一个单独的行为作为参数传递给另一个方法时用到 具体语法:t -> t.toString();其中 t 代表入参,如果是有多个,就用()括住,参数之间用逗号…

Java 代理

代理模式:为目标对象(被调用方)提供一个包装类即代理对象,调用方通过调用代理对象来达到调用目标对象的目的,这样就实现调用方与目标对象之间的解耦。 java中的代理模式分为静态代理和动态代理两种。 静态代理编码…

《算法与数据结构》第七章[算法2]:广度优先搜索(BFS) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

中转API为什么比官方更便宜?AI中转站成本揭秘

中转API为什么比官方更便宜?AI中转站成本揭秘 近两年,AI 大模型飞速发展,OpenAI、Anthropic、Google、Azure 等官方 API 成本依旧高企,大量个人和开发者无法承受长期高成本。但你会发现:市面上有不少 AI 中转站,…

Java 混合编程

Java内置了脚本语言引擎,支持直接对JavaScript语言的调用(直接调用是指直接在java源码中编写相应的脚本语言,然后通过引擎加载,直接使用),也支持Groovy和R语言,可通过 ScriptEngineManager manager = new Scrip…

Java 语法糖

for-each:语法简便,可避免数组越界,无法更新(更新是指把集合内的某一个对象替换成另一个,不是对象内部值的修改)和删除集合内对象,无法知道当前元素的位置索引 枚举:JDK5提出的,用enum进行声明,表示一组限定值…

JAVA RMI编程

RMI:远程方法调用,不同机器上的java进程通讯的时候,可以采用这种方法,基本流程,服务端到RMI上进行注册,客户端请求RMI,获取RMI上注册的服务,并存储到本地,客户端通过存储在本地地址,对服务端进行访问 与网络…

大资料毕业设计选题推荐-基于大数据的全球产品库存数据分析与可视化系统-大材料-Spark-Hadoop-Bigdata

大资料毕业设计选题推荐-基于大数据的全球产品库存数据分析与可视化系统-大材料-Spark-Hadoop-Bigdata2025-10-26 12:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: norma…

纸笔群群友命题乱做

进行日常纸笔练习/fendou感觉群友很厉害阿! W1 10/32 主题:Yajilin,我觉得很难的一类纸笔,该加训了。 基础规则:你需要染黑一些格子,并给出一条回路,经过所有白色格子,不经过线索格和涂黑格,线索格表示从这个…

本人对KMP如何匹配到所有结果的算法存在一些疑惑...

本人对KMP如何匹配到所有结果的算法存在一些疑惑...一秀尼... 算法 呀咯!!!!/*_ooOoo_o8888888o88" . "88(| -_- |)O\ = /O____/`---\____. \\| |// `./ \\||| : |||// \/ _||||| -:- |||…

字符与Java国际化编程

ASCII 美国信息交换标准代码 包含英语和西欧语言 GB2312 1980年提出,GBK 1995年提出 GB18030 2000年和2005年各有一个版本,主要表述汉字,包含的汉字越来越多 Unicode 字符集 ,目标包含所有的文字 实现方式主要是UT…

完整教程:京东100道GO面试题及参考答案(上)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ubuntu 系统 /dev/sdb2(RAID 关联磁盘)挂载操作手册

一、磁盘核心信息梳理设备 容量 分区情况 状态 用途说明/dev/sda 446.63GiB /dev/sda1(512M,EFI 分区)、/dev/sda2(446.1G,Linux 分区) 已挂载(根目录 /) 系统盘,承载操作系统及核心文件/dev/sdb 1.75TiB /de…

2025 年 10 月厨房排烟、厨房排烟罩、厨房排烟系统厂家最新推荐,资质、案例、售后三维测评与选购指南

厨房排烟系统作为商用餐饮运营的核心基础设施,其性能直接关乎后厨环境安全与合规经营。据北京消防协会 2025 年行业报告显示,因安装不规范导致的排烟故障占厨房安全隐患总数的 62%,而中国质量协会数据表明,具备完善…

解决 Windows 下 Claude 通过 cmd/powershell 运行出错失去响应的问题

问题描述:Windows 下在终端中运行 Claude,如果尝试让它在磁盘中查找文件,很容易因为缺少 cgypath 导致 Claude 进程出错⎿ Error: Command failed: cygpath -u C:\Users\liutao\AppData\Local\Temp/usr/bin/bash: …

# Ubuntu 根目录空间扩展操作手册(基于 RAID 关联磁盘 /dev/sdb2)

核心结论 直接将 /dev/sdb2 挂载至根目录 / 风险极高,易导致系统崩溃,优先采用“LVM 逻辑卷扩容”(推荐)或“绑定挂载”方案,安全扩展根目录可用空间。 一、直接挂载根目录的风险警示根目录 / 包含 /etc(系统配置…

013的加密世界权威指南_第二部分

013的加密世界权威指南_第二部分前言 本文档是“013加密世界权威指南”系列的第二部分,聚焦于加密资产交易与去中心化金融(DeFi)的实践入门。内容涵盖顶级中心化交易所(CEX)的深度对比、交易费用机制的解析、去中心化…

Perplexity Comet AI浏览器「等待网络链接」解决方案

5步解决Perplexity Comet AI浏览器「等待网络链接」💻✨ 宝子们!是不是被Perplexity Comet AI浏览器的「等待网络链接」弹窗搞心态了?😭 试了N种方法都没用?别慌!亲测有效的5步解决方案来啦,跟着做秒搞定👇…

Redis 持久化 内存模型 - 指南

Redis 持久化 & 内存模型 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…