SCP/NOIP 复习:插板法

自己写一遍插板法的东西,顺便补上 oiwiki 上没有的一个证明。

偏向整理,别人估计不知道我在干什么。

基本模型:\(x_0+x_1+...+x_k=n\) 的正整数或非负整数解数量,可以抽象为元素组的划分。

正整数解的数量

也是插板法最基本的模型。

\(n\)相同的元素,将它们分成 \(k\) 组,并且要求每组不是空的,求统共有多少种分配方法。

注意是元素相同组别不同。

为什么标粗相同的元素?不相同就不能用插班法了,插班法依赖于元素的不可区分性。

我们将这个问题视作把 \(k-1\) 个隔板放入 \(n-1\) 个空隙之间。

也就是 \(\binom{n-1}{k-1}\)

问题等同于求解 \(x_0+x_1+...+x_k=n\) 的正整数解数量。

这里的 \(x_i\) 表示 \(i\) 组的个数。

非负整数解的数量

现在去掉限制每组不是空,也就是允许每组是空的。

由于元素的等同的,我们可以先添加 \(k\) 个元素,再进行上述插班法,最后再抽去我们添加的元素。

得到答案 \(\binom{n+k-1}{k-1}\)=\(\binom{n+k-1}{n}\)

问题等同于求解 \(x_0+x_1+...+x_k=n\) 的非负整数解数量。

以上便是基本的两大模型,我们遇到问题可以试着转化模型。

下界不同的整数解的数量

我们规定对于第 \(i\) 组必须至少要分配到 \(a_i\) 个元素。

这个时候我们选择转化成数学模型,问题变复杂时我们不能总是依赖直观。

我们设 \(x_i\) 为每组的个数,尝试转化成我们熟悉的数学模型。

\(x_0+x_1+...+x_k=n\)

\(x_i'=x_i-a_i\),这个样子我们就可以转化成以下东西。

\(x_0'+x_1'+...+x_k'=n - \sum a_i\)

其中 \(x_i\) 必须是非负整数。

这不就转化成之前的问题了。

答案自然是 \(\binom{n-\sum a_i +k-1}{n-\sum a_i}\)

不相邻的排列数量

\(1到n\) 的自然数可以选(一个排列),我们需要选择 \(k\) 个数,使得这些数在大小上互相不相邻,请问有多少种选法。

这个看似不太可以使用插板法分析,明明元素之间并不是相同的。

但是我们发现两个离得最近的被选择的数之间的大小差异是相同的。

我们考虑如下转化。

\(x_i\) 为比 \(x\) 小的最大数与 \(x\) 中间的没有被选的数量,\(miao\) 表示比 \(k\) 大的没有被选的数量。

这个样子我们可以列出来式子 \(x_1+x_2+...+x_k+miao=n-k\)

其中 \(x_1 \ge 0\),其他 \(x_i \ge 1\)\(miao\ge 0\)

这个样子就成了之前的老问题。

我们转化一下,仿照上边的思路。

\(x_1'=x_1+1\)\(miao'=miao+1\)

这样就成了第二个问题。

\(x_1'+x_2+...+x_k+miao'=n-k+2\)

\(x_i,miao\) 都是非负整数。

直接套刚才式子得出答案是 \(\binom{n-k+1}{k}\)

为什么不是 \(k-1\)\(miao\) 也是元素啊。

简单的例题 P2638

复习玩排列组合正好写到一道,遂补上去。

一共有 \(n\) 个储存区,储存区里边可以放任意多 0 和 1,当然,也可以什么都不放。

我们的 0 和 1 的总数量是有限的,放的时候并不一定要放完才行。

0 一共有 \(a\) 个,1 一共有 \(b\) 个。

询问一共有多少种方法。

我一开始并没有思路,于是尝试将问题转化为数学模型来分析。

一转化出来就知道怎么做了。

\(x_i\) 表示 \(i\) 格子中的 0 个数

\(y_i\) 表示 \(i\) 格子中的 1 个数。

枚举使用了 \(i\) 个 0,\(j\) 个 1。

我们得到数学问题,分别求以下的非负整数解个数。

\(x_1+...+x_n=i\)

\(y_1+...+y_n=j\)

因为两个互不影响,所以把答案乘起来就行了,怎么算我就不多说了,和上边显然是一样的。

形式化就是求解 \(\sum_{i=0}^{a}\sum_{j=0}^{b}\binom{i+n-1}{i}\times\binom{j+n-1}{j}\)

有个神经病的 hack 需要 __int128 才可以通过。

代码↓

#include <bits/stdc++.h>
#define int __int128
using namespace std;
const int MN=51;
int C[MN][MN], ans=0;
void Pre(){for(int i=0; i<MN; ++i){for(int j=0; j<=i; ++j){if(!j) C[i][j]=1;else C[i][j]=C[i-1][j]+C[i-1][j-1];}}
}
int n, a, b;
inline void Read(int &n){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}n=x*f;
}
inline void print(int n){if(n<0){putchar('-');n*=-1;}if(n>9) print(n/10);putchar(n%10+'0');
}
signed main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);Pre(); Read(n), Read(a), Read(b);for(int i=0; i<=a; ++i){for(int j=0; j<=b; ++j){ans+=C[i+n-1][i]*C[j+n-1][j];}}print(ans);return 0;
}

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

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

相关文章

内存泄漏与SWAP

内存泄漏如何发生 没正确回收分配后的内存,导致了泄漏。 访问的是已分配内存边界外的地址,导致程序异常退出 用户空间内存包括多个不同的内存段,比如只读 段、数据段、堆、栈以及文件映射段等。这些内存段正是应用程…

今天开通自己的博客啦,加油加油!成为合格的牛马! - Irving11

前几天已经学习了一些SQL相关知识,今天将继续学习,并写下总结 知识总结: 一、关于SQL的一些细节 1、create_sql是命令文本,cursor.execute(create_sql)才是执行命令的动作。没有这个动作,所有关于创建表的想法都只…

2025安全光栅厂家最新权威推荐榜:精准防护与高效性能的工业

2025安全光栅厂家最新权威推荐榜:精准防护与高效性能的工业随着工业自动化技术的不断发展,安全光栅作为关键的安全防护设备,在现代工厂中的应用越来越广泛。安全光栅能够有效防止操作人员进入危险区域,确保生产过程…

2025年10月精加工车间恒温恒湿系统厂家推荐:精准控温与高效节能首

随着工业技术的不断进步,精加工车间对环境控制的要求越来越高。恒温恒湿系统作为保障车间生产环境的关键设备,其性能和稳定性直接影响到产品的质量和生产效率。本文将为您推荐几家在精加工车间恒温恒湿系统领域表现卓…

977. 有序数组的平方 双指针

977. 有序数组的平方 相向双指针 思路 nums数组非递减,平方后最大值一定在待排序区间的最两端(最左端 left 或最右端 right),每次循环取最大值添加到res数组中, 更新对应的边界缩小区间,重复上述过程直至 left &…

完整教程:iSCSI服务器

完整教程:iSCSI服务器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

深入解析:数据库视图:虚拟表的强大应用

深入解析:数据库视图:虚拟表的强大应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

非常好的学习方式是哪样

非常好的学习方式是哪样pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

agc001_c题解

水的炸天,不做解释自己看吧 #include<bits/stdc++.h> #define MAXN 2010 #define inf 0x3f3f3f3f #define int long long using namespace std; namespace SHuxinn{struct node {int lst;int dep;int nxt ;} tr…

【Trie】 UVA1401 Remember the Word - 教程

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

【IMU】6轴数据校准算法

【IMU】6轴数据校准算法 算法概述 本算法用于惯性测量单元的自动校准,通过多次采样和优化选择,确定传感器的最佳偏移量。 算法步骤初始化converged = false(加速度计收敛标志) new_offset = {0,0,0}(最优偏移量)…

2025 年 MES 服务商 TOP 平台机构推荐排行榜,mes 系统 /mes 软件 /mes 制造执行系统 /mes 生产制造执行系统 /mes 生产管理系统公司推荐

当前,离散制造行业正面临生产流程复杂、在制品管控难度大、数据协同滞后等突出问题。电子、家电、五金加工等领域的企业,往往受困于多工厂管理协同不畅、生产异常响应迟缓、质量追溯精准度不足等痛点,导致生产效率难…

2025 年10月 WMS 服务商最新推荐榜单,wms系统 wms软件,wms仓库管理软件,wms仓库管理系统软件公司推荐

在离散制造行业加速数智化转型的当下,仓储管理作为企业生产与供应链协同的核心环节,正面临着多重挑战。电子、家电、五金加工等领域的企业,往往存在库存信息滞后、出入库效率低下、账实不符等问题,传统依赖人工记忆…

【仿生机器人】核心采购清单 (仿生机器人头方案)

【仿生机器人】核心采购清单 (仿生机器人头方案)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

Matlab凭借GUI实现点云的中值滤波(附最简版)

Matlab凭借GUI实现点云的中值滤波(附最简版)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

CF数据结构题做题记录-1

CF3000的数据结构题做题记录-1 CF464E. The Classic Problem 肯定还是跑最短路,假设比较的复杂度是 \(O(\alpha)\),相加的复杂度是 \(O(\beta)\),那么我们直接使用 dijkstra 的复杂度是 \(O(\alpha(n+m)\log n+\bet…

完整教程:安宝特产品丨FME Realize:重构数据与现实的边界,让空间计算赋能现场决策

完整教程:安宝特产品丨FME Realize:重构数据与现实的边界,让空间计算赋能现场决策pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

尝试对音频功率放大器芯片的噪声基底特性进行测量与计算:以纳芯威NS4268为例

前言 最近我有一个项目需要用到带音量控制功能的耳机音频功率放大器芯片。在群友的推荐下,我选择了NS4268,但测试后发现它的噪声性能较差。于是,我制作了测试PCB,对其噪声特性进行简单测量。 测试PCB 测试使用的PC…

常见问题解决 --- wireshark安装失败

常见问题解决 --- wireshark安装失败Wireshark 4.2 是官方支持 Windows 10 的最后一个发布分支。 Wireshark 4.0 是官方支持 Windows 8.1 和 Windows Server 2012 的最后一个发布分支。 Wireshark 3.6 是官方支持 32 位…

Node.js 性能优化:实用技巧与实战指南 - 教程

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