首页 > 其他分享 >「TC SRM625 D1L3」Seatfriends

「TC SRM625 D1L3」Seatfriends

时间:2025-01-17 21:49:12浏览次数:1  
标签:Seatfriends D1L3 int text LL ret TC dp mod

思路

首先,对于计数题,不是 \(\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 \to dp_{i + 1, j + 1} , dp_{i + 1, j - 1} \\ dp_{i, j} \times 2j \to dp_{i, j} \]

对于 \(dp_{i, j} \times j\) 即将当前数插入到/合并已有的 \(j\) 个区间。对于 \(dp_{i, j} \times 2j\) 即加入到已有的 \(j\) 个区间的两侧。


对于计数,盒子与球的公式已给,现在就要将所有 \(dp_{m, i}\) 加起来,答案就是

\[\sum_{i = 1}^{k}{dp_{m, i} \times C_{n - m - 1}^{i - 1}} \]

此外,对于 \(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;
}

标签:Seatfriends,D1L3,int,text,LL,ret,TC,dp,mod
From: https://www.cnblogs.com/keysky/p/18677685

相关文章

  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程
    一、搜索二维矩阵编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。可以使用从右上角开始搜索的方法来有效地找到目标值。选择起始位置:从矩阵的右上角开始。......
  • 云原生&K8S&confing泄露&etcd&proxy
    一、Etcd未授权访问攻击port:2379;默认通过证书认证,主要存放节点的数据,如一些token证书。第一种情况:没有配置--client-cert-path参数打开证书验证(或者改为false),暴露外Etcd服务存在未授权访问风险;暴露外部可以访问,直接未授权访问获取secrets和token利用;第二种在打开证书......
  • 关于vue3 路由离开前 更新pinia 导致页面watch被触发 解决方法
    背景:在vue中,使用watch监听pinia中的数据是否变化来调用apiwatch(()=>{return[pinia.data,]},(newV,oldV)=>{axios.get('a.b',params).then((response)=>{........});},{immediate:true})在监听piniadata的时候,如......
  • 【论文阅读】GROOT:Learning to Follow Instructions by Watching Gameplay Viedos
    GROOT:LearningtoFollowInstructionsbyWatchingGameplayViedos.作者为北京大学梁一韬所在的TeamCraftJarvis,发表时间为2023Background在开放世界下开发类人级别的具身智能体以解决开放式任务一直是人工智能领域长期以来追求的目标。随着ChatGPT的流行,近年来涌现了一批......
  • RestClient查询文档(*)
    match_all查询代码解读:第一步,创建SearchRequest对象,指定索引库名第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等query():代表查询条件,利用QueryBuilders.matchAllQuery()构建一个match_all查询的DSL第三步,利用client.search()发送请求,得到......
  • qt switchbutton
    qt实现的SwitchButton,从网上抄的代码,然后进行一些修改完善,如下switchbutton.h点击查看代码#ifndefSWITCHBUTTON_H#defineSWITCHBUTTON_H#include<QObject>#include<QWidget>#include<QTimer>#include<QColor>#include<QDebug>#definemyDebugqDebu......
  • leetcode第390场周赛
    目录100245.每个字符最多出现两次的最长子字符串100228.执行操作使数据元素之和大于等于K100258.最高频率的ID100268.最长公共后缀查询leetcode第390场周赛100245.每个字符最多出现两次的最长子字符串题意给定一个长度小于等于100的仅由小写字母构成的字符串,请你......
  • STM32 RTC 功能详解与代码示例
    一、引言STM32微控制器的实时时钟(RTC)功能在许多应用中都非常重要,它允许设备保持精确的时间和日期信息,即使在系统断电或复位后,只要有备用电源(如锂电池)为RTC供电,就能继续运行。这对于需要时间戳、定时任务、日历功能以及其他需要精确时间信息的应用程序来说是必不可少的,例......
  • STC12单片机设置50Hz的PWM波驱动舵机
    STC12单片机设置50Hz的PWM波驱动舵机一、引言在机器人控制、航模制作以及各种自动化设备领域,舵机作为一种关键的执行元件,能够精准地控制角度,实现诸如机械臂关节运动、模型转向等功能。而使用STC12单片机来产生50Hz的PWM波驱动舵机,是一种经济高效且灵活的方案。STC12系列单......
  • 使用QFuture和QFutureWatcher实现不阻塞界面的Async函数
    简述很多时候,在Qt里面需要运行一个耗时函数的时候,为了避免阻塞界面,需要放入非主线程去执行。实现这样处理的方法有好几种,例如:写一个继承自QThread类,实现run接口;写一个继承自QObject的类,添加槽函数执行任务,创建对象,移入一个QThread中进行调用;写一个QRunnable的子类,创建对象,添......