【牛客挑战赛30D】小A的昆特牌(组合问题抽象到二维平面)
大致题意: 有\(S\)张无编号的牌,可以将任意张牌锻造成\(n\)种步兵或\(m\)种弩兵中的一种,求最后步兵数量大于等于\(l\)小于等于\(r\)的方案数。
暴力式子
首先我们来考虑暴力式子。
假设我们确定了要选\(x\)个步兵数量,然后要求出此时的方案数。
则我们就要使用隔板法。
仔细思考,其实我们就相当于要求出把\(x\)个步兵分成\(n\)组和把\(S-x\)个步兵分成\(m+1\)组的方案数的乘积。(其中\(m+1\)组指的是\(m\)种弩兵以及不锻造这\(m+1\)种情况)
而这两个要求的东西本质上是一样的。
以把\(x\)个步兵分成\(n\)组为例,考虑到这是无编号的,因此我们完全可以假设每个步兵被分到的组号是递增的。
那也就是说,我们要求把一个长度为\(x\)的序列分割成\(n\)部分(可以为空)的方案数。
而分割成\(n\)部分,就相当于加入了\(n-1\)块隔板。
如果把隔板也看做序列的一部分,则序列总长度就变成了\(x+n-1\),而分割就相当于要在这个序列中选出\(n-1\)个位置。
因此方案数就是:
\]
同理,把\(S-x\)个步兵分成\(m+1\)组的方案数就是:
\]
于是它们的乘积就是:
\]
而最终答案就是:
\]
抽象问题到二维平面
我们可以发现,这其实就相当于从\((0,0)\)走到\((S,n+m)\),且必须经过点\((l,n)\)下方,不能经过点\((r+1,n)\)下方的方案数。
这其实就相当于用经过点\((l,n)\)下方的方案数减去经过点\((r+1,n)\)下方的方案数。
应该还是比较简单的。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 10000000
#define X 998244353
#define max(x,y) ((x)>(y)?(x):(y))
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,m,s,l,r,Inv[(N<<1)+5],p1[N+5],p2[N+5];
I int C(CI x,CI y)//求组合数
{
if(x<y||x<0) return 0;RI i,res=1;//判断越界
for(i=1;i<=y;++i) res=1LL*res*(x-i+1)%X*Inv[i]%X;//统计答案
return res;//返回答案
}
I int Calc(CI x)//计算经过点(x,n)下方的方案数
{
RI i,res=0;for(p1[0]=i=1;i^n;++i) p1[i]=1LL*p1[i-1]*(x-1+i)%X*Inv[i]%X;//计算p1
for(p2[n-1]=C(s-x+m+1,m+1),i=n-2;~i;--i) p2[i]=1LL*p2[i+1]*(s-x+n+m-i)%X*Inv[n+m-i]%X;//计算p2
for(i=0;i^n;++i) Inc(res,1LL*p1[i]*p2[i]%X);return res;//统计答案
}
int main()
{
RI i,lim;scanf("%d%d%d%d%d",&n,&m,&s,&l,&r);
for(Inv[0]=Inv[1]=1,i=2,lim=max(n,m)<<1;i<=lim;++i) Inv[i]=1LL*(X-X/i)*Inv[X%i]%X;//线性求逆元
return printf("%d",(Calc(l)-Calc(r+1)+X)%X),0;//输出答案
}
【牛客挑战赛30D】小A的昆特牌(组合问题抽象到二维平面)的更多相关文章
- 牛客挑战赛30D 小A的昆特牌(组合数学)
题面 传送门 题解 很容易写出一个暴力 \[\sum_{i=l}^r {i+n-1\choose n-1}{s-i+m\choose m}\] 即枚举选了多少个步兵,然后用插板法算出方案数 我们对这个 ...
- [牛客挑战赛 30D] 小A的昆特牌 解题报告 (组合数学)
interlinkage: https://ac.nowcoder.com/acm/contest/375/D description: solution: 我们枚举步兵的数量$x$,还剩下$S-x$ ...
- 牛客挑战赛30 小G砍树 树形dp
小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...
- 牛客挑战赛30-T3 小G砍树
link 题目大意: n个节点的带标号无根树.每次选择一个度数为1的节点并将它从树上移除.问总共有多少种不同的方式能将这棵树删到只剩 1 个点.两种方式不同当且仅当至少有一步被删除的节点不同. 题解: ...
- 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp
LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...
- 牛客挑战赛 30 A 小G数数
题目链接:https://ac.nowcoder.com/acm/contest/375/A 分析:我写的时候竟然把它当成了DP....... 还建了个结构体DP数组,保存一二位,不知道当时脑子在抽啥 ...
- 5.15 牛客挑战赛40 C 小V和字符串 数位dp 计数问题
LINK:小V和字符串 容易想到只有1个数相同的 才能有贡献. 知道两个01串 那么容易得到最小步数 大体上就是 第一个串的最前的1和第二个串最前的1进行匹配. 容易想到设f[i][j]表示 前i位1 ...
- 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...
- 5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
LINK:小V的序列 考试的时候 没想到正解 于是自闭. 题意很简单 就是 给出一个序列a 每次询问一个x 问序列中是否存在y 使得x^y的二进制位位1的个数<=3. 容易想到 暴力枚举. 第一 ...
随机推荐
- storm(2)-机制
1.storm vs esper 2.storm vs spark streaming storm处理的是每次传入的一个事件:spark streaming 处理的是某个时间段窗口内的事件流. 因此 ...
- CI 框架中的日志处理 以及 404异常处理
最近在整理项目中的日志问题,查了一些关于 “CI 框架中的日志处理 以及 404异常处理” 的东西,顺便记录一下: 关于错误日志: 1. 在CI框架中的 system/core/CodeIgniter ...
- 文献综述六:基于JS 技术的电子商品管理系统设计及实现
一.基本信息 标题:基于JS 技术的电子商品管理系统设计及实现 时间:2017 出版源:无线互联科技 文件分类:js技术的研究 二.研究背景 主要对Js下电商管理系统的设计及实现进行了探讨,利用软件工 ...
- stream3
import java.util.function.Consumer; import java.util.function.IntConsumer; public class ConsumerTest ...
- windows环境下MySQL-5.7.12-winx64下载安装与配置
系统:64位Win-7 官网压缩包:mysql-5.7.12-winx64.zip 前后花了一些时间,以前都是下载软件直接安装在本地,现在这个不一样,下载压缩包后要解压缩到安装目录,然后在控制台下配置 ...
- Become a Better Programmer: 5 Essential Methods at a Glance--reference
http://www.git-tower.com/blog/become-a-better-programmer-5-essentials/ Become a Better Programmer: 5 ...
- textarea的实现
由于限制字数是用原有的 maxlength会有问题,所以用一般会用js控制,今天用到三种: (一)html: <body> <form name=myform action=&quo ...
- 从Linux服务器下载文件到本地
通过安装xshell,连接服务器,通过以下命令可以方便的将服务器的文件下载到本地 #下载一个文件 sz filename #下载多个文件 sz filename1 filename2 #下载dir目录 ...
- C# .net页面乱码
可在web.config中设置 <globalization requestEncoding="utf-8" responseEncoding="utf-8&quo ...
- C# 面向对象多态的抽象性&接口 object&is as类型转换运算符
抽象类/抽象方法 abstract 抽象的数据类型 抽象类不能被实例化 抽象类中不一定存在抽象方法 抽象方法一定是在抽象类中 抽象类里可以放任意的方法 接口 interface 不是类,就是用来当爹 ...