「TC SRM625 D1L3」Seatfriends
思路
首先,对于计数题,不是 \(\text{dp}\) 就是排列组合,这题多思考一会儿就发现单纯 \(\text{dp}\) 和排列组合是做不出来的。然后激动人心地发现,这题是 \(\text{dp} \ +\) 排列组合。
现在来思考怎么做,我们可以发现如果不考虑区间两两之间的空座位,当成选为一个个集合的话是非常好 \(\text{dp}\) 的,但对于空格的处理无法使用 \(\text{dp}\) 处理的,同时对于两两不相邻的区间,必须插入至少 \(1\) 个空格以消除 \(\text{dp}\) 没考虑空格的影响。
现在问题就转换为有 \(i\) 个不同物品,共 \(n - k\) 块隔板,要在每两个物品间插入至少一个相同隔板,问有多少种方案数,即盒子与球,计数为 \(C_{n - k - 1}^{i - 1}\) ,再乘上 \(dp_{k, i}\) 并将所有 \(i\) 加起来。
细节
对于 \(\text{dp}\) ,是一个插入 \(\text{dp}\) ,使用刷表更容易,定义 \(dp_{i, j}\) 表示选了前 \(i\) 个人,共 \(j\) 个区间的方案数,然后推转移,若刷表即如下:
\]
\]
对于 \(dp_{i, j} \times j\) 即将当前数插入到/合并已有的 \(j\) 个区间。对于 \(dp_{i, j} \times 2j\) 即加入到已有的 \(j\) 个区间的两侧。
对于计数,盒子与球的公式已给,现在就要将所有 \(dp_{m, i}\) 加起来,答案就是
\]
此外,对于 \(n = m\) 的情况,上述式子就失效了,因为 \(n - m - 1 < 0\) ,但因为最后只剩一个区间,所以可以取 \(dp_{m - 1, 1}\) 为答案,\(m - 1\) 的原因即在最后连成环之前必须是只剩一个区间而最后 \(dp_{m, 1}\) 会从不合法的 \(dp_{m - 1, 2}\) 转移。
Code
/*
address:https://vjudge.net/problem/TopCoder-12909
AC 2024/12/27 21:30
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2005;
const int mod = 1e9 + 7;
int n, m, t;
LL dp[N][N];
LL C[N][N];
inline void trans(LL& x, LL y) { x = (x + y) % mod; }
inline LL power(LL a, LL k) {
LL ret = 1;
while (k > 0) {
if (k & 1) ret = ret * a % mod;
a = a * a % mod;
k >>= 1;
}
return ret;
}
inline LL solve() {
dp[1][1] = n;
for (int i = 1;i < m;i++)
for (int j = 1;j <= i && j <= t;j++) {
if (j < t) trans(dp[i + 1][j + 1], dp[i][j] * j % mod);
if (j > 1) trans(dp[i + 1][j - 1], dp[i][j] * j % mod);
trans(dp[i + 1][j], dp[i][j] * j % mod * 2 % mod);
}
if (n == m) return dp[m - 1][1];
LL ret = 0;
for (int i = 1;i <= t;i++)
trans(ret, dp[m][i] * C[n - m - 1][i - 1] % mod);
return ret;
}
int main() {
scanf("%d%d%d", &n, &m, &t);
C[0][0] = 1;
for (int i = 1;i <= n;i++) {
C[i][0] = 1;
for (int j = 1;j <= i;j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
}
printf("%lld", solve());
return 0;
}
「TC SRM625 D1L3」Seatfriends的更多相关文章
- 对于前端,「微信小程序」其实不美好
微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...
- macOS安装「oh my zsh」
目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...
- 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!
如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
- 「前端开发者」如何把握住「微信小程序」这波红利?
由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...
- 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣
「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!
- Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.
在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...
- LOJ6003 - 「网络流 24 题」魔术球
原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...
- LOJ6002 - 「网络流 24 题」最小路径覆盖
原题链接 Description 求一个DAG的最小路径覆盖,并输出一种方案. Solution 模板题啦~ Code //「网络流 24 题」最小路径覆盖 #include <cstdio&g ...
- LOJ6001 - 「网络流 24 题」太空飞行计划
原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...
随机推荐
- 2023年10月,红米(小米)note 8 pro 优化记
看了红米的note 13 pro和note 12 turbo的参数和价格后,我决定下单买个note8 pro的手机壳,确实有新手机的感觉了. 我note8 pro手机参数如下 MIUI 12.0.5 ...
- Redis性能优化的18招
前言 Redis在我们的日常开发工作中,使用频率非常高,已经变成了必不可少的技术之一. Redis的使用场景也很多. 比如:保存用户登录态,做限流,做分布式锁,做缓存提升数据访问速度等等. 那么问题来 ...
- Quartz集群增强版_02.任务轮询及优化❤️
Quartz集群增强版_02.任务轮询及优化 转载请著名出处 https://www.cnblogs.com/funnyzpc/p/18555665 开源地址 https://github.com/f ...
- (Redis基础教程之十三) 如何从命令行更改Redis的配置
介绍 Redis是一个开源的内存中键值数据存储.Redis有几个命令,可让您即时更改Redis服务器的配置设置.本教程将介绍其中一些命令,并说明如何使这些配置更改永久生效. 如何使用本指南 本指南以备 ...
- AbstractQueuedSynchronizer源码解析之ReentrantLock(二)
上篇文章分析了ReentrantLock的lock,tryLock,unlock方法,继续分析剩下的方法,首先开始lockInterruptibly,先看其API说明:lockInterruptibl ...
- Python:pygame游戏编程之旅六(游戏中的声音处理)
一款人性化的游戏中缺少不了声音,比如角色挂时惨叫一声,或PK时武器交锋的声音,还有就是英雄出场时的背景音乐,无不涉及到声音,本节我们就来看一下pygame中如何控制声音,下面是一个例子,但博客上传不了 ...
- SQL SERVER日常运维巡检系列——结构设计
前言 做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期.结果进行登记,同时可能需要出一份巡检报告. 本系列旨在解决一些常见的困扰: 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻 ...
- vue使用docxtemplater导出word
安装 // 安装 docxtemplater npm install docxtemplater pizzip --save // 安装 jszip-utils npm install jszip-u ...
- 09C++选择结构(3)
一.求3个整数中最小值 题目:输入三个整数,表示梨的重量,输出最小的数. 方法1:经过三次两两比较,得出最小值. a<=b && a<=c min=a b<=c &a ...
- Flutter (2.5) - A splash screen was provided to Flutter, but this is deprecated
Flutter (2.5) - A splash screen was provided to Flutter, but this is deprecated 升级到Flutter 2.5 版本后,启 ...