【题解】[UTPC2024] C.Card Deck

题目链接,感觉是计数神题。

原题的模型是每一步可以选择顶部 k k k 张牌的一个子集 X i X_i Xi(可以为空)放在袋中,求 m m m 轮之后所有可能的袋子里牌所组成的集合的大小之和。考虑进行转化,只考虑前 k k k 张牌,每张牌都有一个属性 t i ∈ { 0 , 1 , ⋯   , m } t_i \in \{0,1,\cdots,m\} ti∈{0,1,⋯,m}。若 t i = 0 t_i = 0 ti=0,表示这张牌永远不会被放入袋子中,否则表示这张牌会在第 t i t_i ti 轮被放入袋子中。若 S j S_j Sj 表示第 j j j 轮后袋子里的数,最后求 ∑ i = 1 m ∣ S j ∣ \sum \limits_{i = 1}^m |S_j| i=1∑m∣Sj∣。

设两个模型为 A , B A,B A,B,下证明两个模型等价。

证明

  • A → B A \to B A→B

    对于 ∀ i ∈ 1 , k \forall i \in 1,k ∀i∈1,k,若 i ∈ X j i \in X_j i∈Xj 则有 t i = j t_i = j ti=j,否则 t i = 0 t_i = 0 ti=0。

  • B → A B \to A B→A

    在进行第 j j j 步前,所有 t i < j t_i < j ti<j 的牌都已经放入袋中,总共有 ∣ { i ∣ t i < j } ∣ |\{i \mid t_i < j\}| ∣{i∣ti<j}∣ 张。由于放入袋中后会进行补位,也就是说我们并不关心补进来的是哪一张真正的原始牌,当进行第 j j j 步前,牌堆的前 k k k 张牌一定存在所有 t i = j t_i = j ti=j 的牌,也就是说第 j j j 步删掉 { i ∣ t i = j } \{i \mid t_i = j\} {i∣ti=j} 是合法操作。

因此可以对每一张牌单独计算贡献。也就是 ∑ i = 1 m ∣ S j ∣ = ∑ i = 1 k 1 t i > 0 = ∑ i = 1 k t i \sum \limits_{i = 1}^m |S_j| =\sum \limits_{i = 1}^k \bold{1}{t_i > 0} = \sum \limits{i = 1}^k t_i i=1∑m∣Sj∣=i=1∑k1ti>0=i=1∑kti

。共有 k k k 张牌,所有合法的 { t i } \{t_i\} {ti} 的方案数为 ( m + 1 ) k (m + 1)^k (m+1)k。强制令 t i = j t_i = j ti=j,则这张牌的贡献为 ( m + 1 ) k − 1 (m + 1)^{k - 1} (m+1)k−1。由于 t i ∈ { 0 , 1 , ⋯   , m } t_i \in \{0,1,\cdots,m\} ti∈{0,1,⋯,m},则这张牌出现在集合里的次数为 ( 0 + 1 + ⋯ + m ) × ( m + 1 ) k − 1 (0 + 1 + \cdots + m) \times (m + 1)^{k - 1} (0+1+⋯+m)×(m+1)k−1,即 m ( m + 1 ) k 2 \frac{m(m + 1)^k}{2} 2m(m+1)k。再由于 k k k 张牌等价,所以最后的答案为

k m ( m + 1 ) k 2 \dfrac{km(m + 1)^k}{2} 2km(m+1)k

相关推荐
学计算机的计算基5 分钟前
回溯算法下篇:四道经典题讲透约束剪枝、原地标记、预计算与状态压缩
java·笔记·算法
咕白m62523 分钟前
通过 C++ 写入数据到 Excel 文档
c++·后端
霸道流氓气质32 分钟前
SpringBoot中实现告警判定算法-位报警与模拟量阈值-技术详解
spring boot·算法·jquery
行者全栈架构师34 分钟前
混元 Hy3 Agent 实战:季度报告 3 小时变 40 分钟
算法·架构·代码规范
兰令水1 小时前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
qz5zwangzihan11 小时前
题解:Atcoder Beginner Contest abc467 F - Email Scheduling Optimization
c++·贪心·atcoder·平衡树·abc467·abc467_f·fhq-treap
好好沉淀1 小时前
主键选择(自增 vs UUID vs 雪花算法)
java·算法
郝学胜-神的一滴2 小时前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
星恒随风2 小时前
C++ STL 详解:list 的使用、迭代器失效、模拟实现与 vector 对比
开发语言·数据结构·c++·笔记·学习·list
退休倒计时2 小时前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript