组合数+隔板法

比武招亲(上)

题目大意

解题思路

枚举差值 d d d。

难点在于用 x x x 个数字,构造一个单调不减的序列,序列元素个数为 m − 2 m-2 m−2。

理解一

运用隔板法,把相同的数字从小到大看作一堆一堆的,隔板插在不同的堆之间。

如数字从 [ 1 , 3 ] [1,3] [1,3] 中选 4 4 4 个时,方法可以如下:

1 | 2 2 | 3

但也有这样的情况:

1 1 1 | | 3

可以看到,隔板可以连在一起,即不选其中的某个数。

原来的空位画出来如下:

□ 1 □ 1 □ 1 □ 3 □

此时的情况如下:

□ 1 □ 1 □ 1 | | 3 □

(两个隔板只占了一个空位的位置)

可以看到,现在的空位是 m − 1 m - 1 m−1 个,但这种隔板相连的情况就不好计算。

因此,我们看作给每个隔板"批发"了一个空位,并且是固定隔板的左边。

即:

现在的 □ | = 原来的 |
现在的 □ □ | = 原来的 □ |

这样的话空位数应该是 m − 1 + d m - 1 + d m−1+d。

但考虑到,第一个隔板只能从第二个位置开始放,否则我们前面假设好的固定在左边的空位就没了,因此最后空位数为 m − 1 + d − 1 = m − 2 + d m - 1 + d - 1 = m-2+d m−1+d−1=m−2+d。

所以最后的选法有 C m − 2 + d d C^d_{m-2+d} Cm−2+dd​ 种。

理解二

感觉上面的比较抽象,下面再贴一个博主的解释:


注意事项

组合数要预处理,否则会 T。

参考代码

#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<unordered_map>
#include<set>
#include<stack>
//#define LOCAL  //提交时一定注释
#include<bits/stdc++.h>
#define VI vector<int>
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long LL;
typedef double db;
const int inf = 0x3f3f3f3f;
const LL INF = 1e18;
const int N = 1e6 + 10;
const LL mod = 998244353;
const int p = 26;inline int readint() {int x; scanf("%d", &x); return x;}LL fac[N];LL qm(LL a, LL b, LL c) {LL res = 1;while (b) {if (b & 1) res = res * a % c;a = a * a % c;b >>= 1;}return res;
}//对阶乘预处理
void f() {fac[0] = 1;fac[1] = 1;for(int i = 2; i <= N; i++) fac[i] = fac[i - 1] * i % mod;
}LL inv(LL x) {return qm(x, mod - 2, mod);
}LL C(LL n, LL m) {//    LL up = 1, dn = 1;
//    for(int i = 1; i <= m; i++) {//        up = up * (n + 1 - i) % mod;
//        dn = dn * i % mod;
//    }
//    return up * qm(dn, mod - 2, mod) % mod;return fac[n] * inv(fac[n - m]) % mod * inv(fac[m]) % mod;
}int main() {#ifdef LOCALfreopen("input.txt", "r", stdin);
//   freopen("output.txt", "w", stdout);
#endifLL n, m;scanf("%lld%lld", &n, &m);f();LL ans = 0;for(int d = 1; d <= n - 1; d++) {ans = (ans + (d * (n - d) % mod * C(m - 2 + d, d) % mod)) % mod;}printf("%lld", ans);return 0;
}

【组合数+隔板法】2021牛客寒假算法基础集训营5 B 比武招亲(上)相关推荐

  1. 2021牛客寒假算法基础集训营5 B.比武招亲(上)

    2021牛客寒假算法基础集训营5 B.比武招亲(上) 题目链接 题目描述 众所周知,天姐姐只喜欢天下最聪明的人,为了找到这样的人,她决定比武招亲! 只见天姐姐在榜上留下了这样一道问题,谁做出来了就可以 ...

  2. 2021牛客寒假算法基础集训营5 B 比武招亲(上)

    题目链接 题目描述 思路 选取的序列a可能的贡献有 0,1,2,3,-,n-1. 设a的贡献为d. 贡献为d的序列有 [1,-,1+d], [2,-,2+d]- (共有n-d个这样的序列) 对贡献为d ...

  3. 2021牛客寒假算法基础集训营5 B. 比武招亲(上)

    链接 https://ac.nowcoder.com/acm/contest/9985/B 题意 给定 n , m n,m n,m,定义一种序列,构造方法如下: 在 [ 1 , n ] [1,n] [ ...

  4. 2021牛客寒假算法基础集训营5 B 比武招亲(上)

    链接 https://ac.nowcoder.com/acm/contest/9985/B 思路 打表,得出一个7X7的表,根据行(m相同的情况下)找规律 第一行差分数列可以写成组合数形式C(n, 3 ...

  5. 2021牛客寒假算法基础集训营1 J 一群小青蛙呱蹦呱蹦呱

    今天的比赛没打( 睡午觉去了,今天太累了 晚上来看看题 2021牛客寒假算法基础集训营1 J 一群小青蛙呱蹦呱蹦呱 题目传送门 板子题( 我们知道由唯一分解定理得,若 n=p1α1×p2α2×p3α3 ...

  6. 【解题报告】2021牛客寒假算法基础集训营4

    [解题报告]2021牛客寒假算法基础集训营4 前面的话 A :九峰与签到题 | 模拟 (签到题) B: 武辰延的字符串 | exKMP D :温澈滢的狗狗 | 二分 E: 九峰与子序列 | d p d ...

  7. 2021牛客寒假算法基础集训营1

    2021牛客寒假算法基础集训营1 A. 串(线性DP) B. 括号(构造) E.三棱锥之刻(几何) F. 对答案一时爽(签到) I. 限制不互素对的排列(构造) J. 一群小青蛙呱蹦呱蹦呱 A. 串( ...

  8. 2021牛客寒假算法基础集训营2 D.牛牛与整除分块

    2021牛客寒假算法基础集训营2 D.牛牛与整除分块 题目链接 题目描述 整除分块,又称数论分块.是数论算法中的重要技巧,你可以在各种需要枚举因子的连续求和类问题中见到它的身影.如杜教筛,莫比乌斯反演 ...

  9. 2021牛客寒假算法基础集训营5 比武招亲(上)(组合数)

    链接:https://ac.nowcoder.com/acm/contest/9985/B 来源:牛客网 题目描述 众所周知,天姐姐只喜欢天下最聪明的人,为了找到这样的人,她决定比武招亲! 只见天姐姐 ...

最新文章

  1. linux 内核 proc_create 函数 内幕初探
  2. 选择P2P平台的技巧和方法
  3. 吴恩达《Machine Learning》精炼笔记 10:异常检测
  4. 操作系统提供什么服务、如何服务?
  5. 【性能测试】性能需求挖掘、性能方案制定及压测场景设计之疑惑与思考(一)
  6. 把txt格式数据制作成xml数据
  7. mysql如何字符编码,如何修改MYSQL的字符编码
  8. 【VS开发】COM组件技术概述
  9. JavaBean的实用工具Lombok(省去get、set等方法)
  10. Java视频教程免费分享(网盘直接取)
  11. 华硕主板升级更新BIOS版本
  12. mouseover和mouseenter的区别?
  13. 使用Amazon SageMaker RL训练离线强化学习策略
  14. 数据结构—队列的C语言实现
  15. Intellij IDEA 神级插件
  16. Linux常用命令|徐奥雯编辑整理|XUAOWEN
  17. python小程序之七段数码读秒
  18. 英语口语266之每日十句口语
  19. 使用“git commit -m“命令时候报error
  20. camera接口---MIPI CSI-2接口、DVP接口和FPD-Link III LVDS、GMSL等接口对比(转)

热门文章

  1. 通过高德地图API实现浏览器定位[以及提高定位精度、获取详细位置信息]
  2. 进入大学应该做的第一件事
  3. 事务隔离性(Isolation)介绍
  4. 制作多系统架构平台镜像
  5. win10 系统更新服务器出错,win10系统更新出错如何解决?win10系统更新出错常见的修复方法...
  6. 【Chrome自动更新修复】检查更新时出错:无法启动更新检查(错误代码为 4: 0x80070005 -- system level)
  7. Qtime非阻塞延时和Sleep阻塞延时
  8. Mybatis向Oracle数据库写数据时报错:无效的列类型1111
  9. 移动端IM实践:实现Android版微信的智能心跳机制
  10. TCP的四次挥手中的等待2MSL