20250928 组合计数

news/2025/10/1 19:42:04/文章来源:https://www.cnblogs.com/Ydoc770/p/19117686

这篇博客只会写一些题解,基础内容和另外一些题,见:

  • 容斥基础
  • 反演基础

P4492 [HAOI2018] 苹果树

Hint:相当于求所有形态二叉树的路径和,考虑一条边 \((u,fa_u)\) 的贡献.

记子树 \(u\) 的大小为 \(sz_u\),把所有路径和拆成每条边会贡献到多少条路径里面,发现这就是 \(sz_u\times(n-sz_u)\). 我们考虑从小到大枚举每个标号,并且枚举子树大直接计算答案.

由于二叉树是一个节点一个节点生成的,相当于有标号. 考虑标号的影响,填到标号 \(i\) 时,前面标号任意,贡献为 \(i!\);子树中标号贡献 \(sz_i!\). 考虑子树生成的方案数,剩下的点选 \(sz_i-1\) 个,其他点全部填到子树外面,方案数为 \({(n-sz_i-1)!\over (i-2)!}\).

最终答案的式子就是:

\[\sum_{i=2}^n\sum_{x=1}^{n-i+1}{x(n-x)\cdot i!{n-i\choose x-1}\cdot x!\cdot{(n-x-1)!\over (i-2)!}} \]

考虑二叉树的生成方案有 \(n!\) 种,因为加入节点 \(i\) 时有 \(i\) 种位置,加入之后总位置又会增加 \(1\). 所以最终答案就是上面那个式子.

P1450 [HAOI2008] 硬币购物

Hint:背包预处理,枚举子集暴力容斥.

硬币数量的限制不好处理,容斥成不考虑限制的方案数减去所有不合法的方案数. 总方案数可以直接完全背包预处理,考虑钦定硬币种类的一个子集超出了限制,子集预先选 \(d_i+1\) 个硬币,方案数是预处理好的. 直接容斥即可.

P10681 [COTS 2024] 奇偶矩阵 Tablica

Hint:考虑一个题意转化:\(a\) 种颜色 \(1\) 个球,另外 \(b\) 种颜色 \(2\) 个球,\(c\) 个有序集合放一个球,\(d\) 个有序集合放两个球且不能有相同颜色的方案数.

上述转化相当于把 \(a\) 行的 \(1\)\(b\) 行的 \(2\) 分配给 \(c,d\) 列. 首先 \(a,b,c,d\) 满足三个等式.

\[\begin{cases} a+b=n\\ c+d=m\\ a+2b=c+2d \end{cases} \]

这是易于枚举的,下面考虑确定的 \(a,b,c,d\) 如何统计方案.

\(a+2b\) 个球排列,按顺序分配给 \(c + d\) 个集合,考虑容斥掉非法的情况:

  • \(\{x,y\}\)\(\{y,x\}\) 被重复统计.
  • 出现 \(\{x,x\}\) 的集合.

前者的处理可以在最后答案除以 \(2^d\),后者考虑容斥,钦定 \(t\) 个集合放相同元素,于是剩下的 \(a+2(b-t)\) 个球排列,最终式子为:

\[\sum_{a+b=n,c+d=m,a+2b=c+2d}{n\choose a}{m\choose b}\sum_{t=0}^{\min(b,d)}{(-1)^t{b\choose t}{d\choose t}t!{(a+2b-2t)!\over2^{b-t}}\over2^d} \]

P11030 『DABOI Round 1』Blessings Repeated

Hint:预处理出 \(T\) 每个区间被 \(S\) 包含的子序列数量,爆搜 \(T\) 的分拆统计答案.

\(k\) 很大,显然不能直接暴力做. 考虑最终的方案一定形如从 \(k\) 串中选择若干个,依次匹配 \(T\) 中的一段. 先预处理 \(f_{i,l,r}\) 表示前缀 \(i\)\(T[l\cdots r]\) 的子序列方案数,有转移:

\[\begin{cases} f_{i,l,r}\leftarrow f_{i-1,l,r}&(s_i\neq t_r)\\ f_{i,l,r}\leftarrow f_{i-1,l,r}+1&(s_i=t_r\wedge l=r)\\ f_{i,l,r}\leftarrow f_{i-1,l,r}+f_{i-1,l,r-1}&(\text{otherwise.}) \end{cases} \]

然后直接爆搜划分统计答案即可.

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn = 5e3 + 10, maxm = 1e1 + 5, mo = 998244353;
const int inv[11] = {0, 1, 499122177, 166374059, 291154603, 856826403, 641926577, 376916469, 421456191, 712324701, 370705776};
ll n, m, k; char s[maxn], t[maxm];
ll f[maxn][maxm][maxm], ans;inline int add(const int &x, const int &y) {return x + y >= mo ? x + y - mo : (x + y < 0 ? x + y + mo : x + y);}
inline void upd(ll &x, const int &y) {return x = add(x, y), void(0);}inline ll C(int x) {ll res = 1;for(int i = 0; i < x; i++) (res *= (k - i) % mo) %= mo;return res * inv[x] % mo;
}
void dfs(int p, int cnt, ll res) {if(p > m) return upd(ans, res * C(cnt) % mo);for(int i = p; i <= m; i++) dfs(i + 1, cnt + 1, res * f[n][p][i] % mo);
}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> k >> (s + 1) >> (t + 1); n = strlen(s + 1), m = strlen(t + 1);for(int i = 1; i <= n; i++) for(int l = 1; l <= m; l++) for(int r = l; r <= m; r++) {f[i][l][r] = f[i - 1][l][r];if(s[i] == t[r]) upd(f[i][l][r], (l == r ? 1 : f[i - 1][l][r - 1]));} dfs(1, 0, 1);cout << ans;return 0;
} 

P9129 [USACO23FEB] Piling Papers G

Hint:考虑数位 DP 预处理出所有区间的答案.

首先差分,转换成求在 \(1\sim x\) 范围的答案. 考虑一个恰当的 DP 方程是 \(f_{l,r,i,j,0/1/2}\) 表示区间 \([l,r]\) 拼出的数字相比于 \(x\) 从低到高 \(i\)\(j\) 位小于/大于/等于的方案数. 转移分讨在加在左边还是右边,以及与 \(x\) 这一位的大小关系即可.

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn = 3e2 + 10, mo = 1e9 + 7;
int n, q, a[maxn], b[20], tot; ll A, B;
int ans[maxn][maxn], f[20][20][3];inline int add(const int &x, const int &y) {return x + y >= mo ? x + y - mo : (x + y < 0 ? x + y + mo : x + y);}
inline void upd(int &x, const int &y) {return x = add(x, y), void(0);}inline int cmp(const int &x, const int &y) {return x == y ? 2 : x > y;}
void calc(ll V, int op) {tot = 0;while(V) {b[++tot] = V % 10, V /= 10;} reverse(b + 1, b + tot + 1);for(int l = 1; l <= n; l++) {memset(f, 0, sizeof f);for(int r = l; r <= n; r++) {for(int i = 1; i <= tot; i++) for(int j = tot; j > i; j--) for(int k = 0; k < 3; k++) {if(a[r] == b[i]) upd(f[i][j][k], f[i + 1][j][k]);else upd(f[i][j][cmp(a[r], b[i])], f[i + 1][j][k]);if(k != 2) upd(f[i][j][k], f[i][j - 1][k]);else upd(f[i][j][cmp(a[r], b[j])], f[i][j - 1][k]);}for(int i = 1; i <= tot; i++) upd(f[i][i][cmp(a[r], b[i])], 2);for(int i = 1; i <= tot; i++) {upd(ans[l][r], op * f[i][tot][0]);upd(ans[l][r], op * f[i][tot][2]);if(i > 1) upd(ans[l][r], op * f[i][tot][1]);}}} return;
}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n >> A >> B;for(int i = 1; i <= n; i++) cin >> a[i];calc(A - 1, -1), calc(B, 1);cin >> q;while(q--) {int l, r; cin >> l >> r;cout << ans[l][r] << "\n";}return 0;
}

P4448 [AHOI2018初中组] 球球的排列

Hint:观察到乘积为平方具有传递性,于是维护颜色,DP 状态区分颜色来进行转移.

我们把每一个点的颜色设为序列里面第一个乘积为平方的位置,为了方便 DP,把所有数先按颜色排序.

考虑填一个数的情况,我们可以往同色对插入一个异色来将其变为合法的,所以要讨论颜色之间的关系. 设 \(f_{i,j,k}\) 表示填完前 \(i\) 个数之后有 \(j\) 对与 \(i\) 颜色不同的相邻对,有 \(k\) 对与 \(i\) 同色的相邻对,记录同色的个数 \(cnt\). 转移分类讨论:

  • \(i\)\(i-1\) 异色,\(i\) 插入异色对.
  • \(i\)\(i-1\) 异色,\(i\) 插入同色对.
  • \(i\)\(i-1\) 同色,\(i\) 插入同色球旁边.
  • \(i\)\(i-1\) 同色,\(i\) 插入同色对.
  • \(i\)\(i-1\) 同色,\(i\) 插入异色对.

分别有转移:

\[f_{i,j,0}\leftarrow f_{i-1,j',j-j'}\times(i-j) \]

\[f_{i,j,0}\leftarrow f_{i-1,j',j-j'+1}\times(j+1) \]

\[f_{i,j,k}\leftarrow f_{i-1,j,k-1}\times(cnt\times2-k+1) \]

\[f_{i,j,k}\leftarrow f_{i-1,j+1,k}\times(j+1) \]

\[f_{i,j,k}\leftarrow f_{i-1,j,k}\times(i-cnt\times2 + k-j) \]

注意边界;滚动数组.

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn = 3e2 + 10, mo = 1e9 + 7;
int n, a[maxn], b[maxn];
int f[2][maxn][maxn];inline int add(const int &x, const int &y) {return x + y >= mo ? x + y - mo : x + y < 0 ? x + y + mo : x + y;}
inline void upd(int &x, const int &y) {return x = add(x, y), void(0);}
inline ll sqr(const ll &x) {return x * x;}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;for(int i = 1; i <= n; i++) {cin >> a[i]; b[i] = i;for(int j = 1; j < i; j++) if(sqr(sqrt(1ll * a[i] * a[j])) == 1ll * a[i] * a[j]) {b[i] = j; break;}} sort(b + 1, b + n + 1);f[0][0][0] = 1;for(int i = 1, cnt = 0; i <= n; i++) {int o = i & 1;memset(f[o], 0, sizeof f[o]);if(b[i] != b[i - 1]) {cnt = 0;for(int j = 0; j < i; j++) for(int j0 = 0; j0 <= j + 1; ++j0) {if(j0 <= j) upd(f[o][j][0], 1ll * f[o ^ 1][j0][j - j0] * (i - j) % mo);upd(f[o][j][0], 1ll * f[o ^ 1][j0][j - j0 + 1] * (j + 1) % mo);}}else {for(int j = 0; j < i; j++) for(int k = 0; k <= cnt; k++){if(k > 0) upd(f[o][j][k], 1ll * f[o ^ 1][j][k - 1] * (cnt * 2 - k + 1) % mo);upd(f[o][j][k], 1ll * f[o ^ 1][j + 1][k] * (j + 1) % mo);upd(f[o][j][k], 1ll * f[o ^ 1][j][k] * (i - cnt * 2 + k - j) % mo);}} cnt++;} cout << f[n & 1][0][0];return 0;
}

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

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

相关文章

哈希问题的一类技巧

浅谈处理哈希问题的一类方法-线段树维护哈希 前言 一个初三蒟蒻粗浅的认知和总结,dalao不喜勿喷。分享的题也大都很水,仅是代表浅层理解。 简介/概括 哈希是一种常用的算法。我们在oi中使用哈希的主要目的是将难以直…

CVPR-2025 | 具身导航指令高效生成!MAPInstructor:基于场景图的导航指令生成Prompt调整策略 - 详解

CVPR-2025 | 具身导航指令高效生成!MAPInstructor:基于场景图的导航指令生成Prompt调整策略 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

技术支持 哈尔滨网站建设个人博客图片

一、 分布式远程服务&#xff08;Remote Service&#xff09; 基于Redis的Java分布式远程服务&#xff0c;可以用来通过共享接口执行存在于另一个Redisson实例里的对象方法。换句话说就是通过Redis实现了Java的远程过程调用&#xff08;RPC&#xff09;。分布式远程服务基于可…

上海做网站的公司排名今天广西紧急通知最新

CDN, 也叫内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是一种构建在分布式网络基础上的网络技术&#xff0c;旨在提高页面的访问速度和用户体验。CDN通过在全球各地部署服务器节点&#xff0c;并将网站的静态和动态内容复制到这些节点上&#xf…

AtCoder Grand Contest 015 - E - Mr.Aoki Incubator

AtCoder Grand Contest 015 - E - Mr.Aoki Incubator 思路解析 设 $ f(S) $ 为初始感染集合为 $ S $。 哪些人能够被最终感染呢? 我们考虑将每个人视作一个点,感染他的人视作它的父亲。再观察 $ f({i}) $ 是什么,将…

9.30 CSP-S模拟25 改题记录

嗯......HZOJ 写在前面 (其实最讨厌whk和OI转换的时候了,尤其是那种不能完全割舍一方的转换) 嗯对大概就是不想改T4就来写题解了。补课后第一场,人终于都回来了,虽然依旧挂如分,但是竟然能够rk3(?)。感觉这场…

永州微网站建设wordpress文章链接带问号

不错的资料&#xff1a; LLVMClang编译器链接器--保值【进阶之路二】 - 掘金 —————————————————————————————————————— 下载 llvm-cookbook example: $ git clone https://github.com/elongbug/llvm-cookbook.git 也可以参照llvm-pr…

vcenter6.7u3/vcsa6.7u3无DNS安装部署(new)

vcenter6.7u3/vcsa6.7u3无DNS安装部署(new)vcsa6.7u3无DNS安装 vcsa6.7u3w下 实测 VMware-VCSA-all-6.7.0-24337536.iso 测试通过版本发布时间内部编号名称down1down26.7U3w 2024-10-28 24337536 VMware-VCSA-all-6…

深入解析:Vue 3 项目开发必用第三方组件与插件全攻略

深入解析:Vue 3 项目开发必用第三方组件与插件全攻略2025-10-01 19:19 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

安康网站建设公司电话神码ai智能写作网站

文章目录 一、引用概念二、引用特性1、引用在定义时必须初始化2、一个变量可以有多个引用3、引用一旦引用一个实体&#xff0c;再不能引用其他实体 三、常引用四、使用场景1、做参数1、输出型参数2、大对象传参 2、做返回值1、传值返回2、传引用返回 五、传值、传引用效率比较六…

全球抗体药表达系统:CHO 细胞主导下,未来十年将迎哪些突破?

抗体类药物已成为治疗癌症、自身免疫病、传染病的核心手段,截至 2025 年 1 月,全球获批上市的抗体类药物达 191 种。这些药物的成功落地,离不开抗体表达系统的支撑 —— 它决定了抗体的产量、质量(如折叠正确性、翻…

衡水营销网站建设网站建设公司行业描述填什么

1. 拉取镜像 docker pull registry.baidubce.com/paddlepaddle/paddle:2.4.0注&#xff1a;写该文章时&#xff0c;Paddle 最新版本为2.5.1&#xff0c;但是在实际安装中会出现与 PaddleHub 2.3.1版本的冲突&#xff0c;故采用2.4.0版本 2. 构建并进入容器 docker run --name…

在建设厅网站上查询注销建造师新建网站需要多少钱

题目描述&#xff1a; 小蓝最近在研究一种浮点数的表示方法&#xff1a;R 格式。对于一个大于 00 的浮点数 d&#xff0c;可以用 R 格式的整数来表示。给定一个转换参数 n&#xff0c;将浮点数转换为 R 格式整数的做法是&#xff1a; 将浮点数乘以 2^n。四舍五入到最接近的整…

完整教程:[论文阅读]Benchmarking Poisoning Attacks against Retrieval-Augmented Generation

完整教程:[论文阅读]Benchmarking Poisoning Attacks against Retrieval-Augmented Generationpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

绕过Cloudflare IP白名单限制的技术解析

本文详细介绍了两种绕过Cloudflare IP白名单限制的技术方法,包括使用Cloudflare Workers创建反向代理和通过DNS记录配置,帮助安全研究人员进行合法的渗透测试。RIP Cloudflare:绕过IP白名单限制 欢迎来到"RIP …

对于实现贪吃蛇游戏的超详细保姆级解析—下 - 教程

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

撕裂的乡土:在人性荒原上寻找微光

我从未将故乡湘源涂抹成田园牧歌的幻境。这座深藏福建武夷山脉褶皱中的村庄,海拔八百米,森林如墨染,云雾终年缠绕山腰,溪涧清可见底。现常住人口仅五十余人,仅为80年代的十分之一人口,时间在这里仿佛凝滞,唯山风…

2025蔬菜配送服务公司 TOP 企业推荐排行榜,深圳、宝安、光明、松岗、东莞、长安、虎门、沙田、厚街、大岭山蔬菜配送推荐

引言​ 在当今社会,蔬菜配送行业作为连接农产品生产与消费的重要纽带,其发展态势备受关注。然而,该行业目前存在着诸多问题。一方面,部分配送公司在食材新鲜度保障上存在不足,由于缺乏有效的冷链物流技术和管理手…

2025液压缸TOP企业品牌推荐排行榜!抓斗、伺服、大吨位、车辆、工程、拉杆、冶金、重载、港机液压缸推荐

引言在液压装备领域,液压缸作为重要的动力传递元件,其品质与性能直接影响着众多行业的生产效率与运行安全。当前,市场上液压缸品牌数量众多,产品质量参差不齐,技术水平也存在较大差异。部分品牌为追求短期利益,在…

2025 年破胶机厂家品牌推荐榜单白皮书,多规格型号 610/710/810、大型、自动型、低温环保、节能省电、自动打块、轮胎破胶机公司推荐

引言​ 在废旧橡胶回收再利用产业蒸蒸日上的今天,破胶机作为不可或缺的关键设备,其性能优劣与质量高低,直接关系到企业的生产效率和最终产品品质。不过,当前破胶机市场呈现出一番复杂景象:制造商数量繁杂,产品质…