interlinkage:

https://ac.nowcoder.com/acm/contest/375/D

description:

solution:

  • 我们枚举步兵的数量$x$,还剩下$S-x$张牌。$x$张步兵要分成$n$份,$S-x$剩下的要分成$m+1$份,其中第$m+1$份的含义是不锻造,注意可以为空
  • $ans=\sum_{x=l}^{r}\dbinom{x+n-1}{n-1}\dbinom{S-x+m}{m}$
  • 但是直接这样算的话要么爆时间,要么爆空间
  • 发现答案的式子其实相当于从$(0,0)$走到$(S,n+m)$必须经过线段$(l,n)->(r,n)$的方案数
  • 可能有人会疑惑为什么是从$(0,0)$走到$(S,n+m)$,感觉像是走到$(S,n+m+1)$啊。但是仔细观察会发现,因为我们枚举的是与线段$(l,n)->(r,n)$的交点,也就是说当走到$y=n$的时候交点就已经固定了,就不能再向右走了。因此从$(0,0)$到$(x,n)$相当于把$x$个横步插入到$n$个部分中。从$(x,n)$到$(S,n+m)$相当于把$S-x$的横步插入到$m+1$个部分中,因为这个时候走到$y=n+m$的时候还可以向右走
  • 该方案数=第$l$步向右走时走到纵坐标$(0,n-1)$的方案数-第$r+1$步向右走时走到纵坐标$(0,n-1)$的方案数
  • 走到第$p$步向右走时走到纵坐标$(0,n-1)$的方案数为$\sum_{i=0}^{n-1}\dbinom{p+i-1}{p-1}\dbinom{S-p+n+m-i}{S-p}$
  • 这样就比较好算了
#include<bits/stdc++.h>
using namespace std; const int N=2e7+,P=;
inline int add(int x,int y){return x+y>=P?x+y-P:x+y;}
inline int dec(int x,int y){return x-y<?x-y+P:x-y;}
inline int mul(int x,int y){return 1ll*x*y-1ll*x*y/P*P;}
int inv[N],f[N],g[N];
int n,m,s,l,r;
int calc(int p)
{
if(p>s)return ;
int res=;
f[]=g[]=;
for (int i=;i<=n+m;i++)
{
g[i]=1ll*g[i-]*(p+i-)%P*inv[i]%P,
f[i]=1ll*f[i-]*(s-p+i)%P*inv[i]%P;
}
for (int i=;i<n;i++) res=add(res,mul(f[n+m-i],g[i]));
return res;
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&s,&l,&r);
inv[]=inv[]=;
for (int i=;i<N;i++) inv[i]=1ll*(P-P/i)*inv[P%i]%P;
printf("%d\n",dec(calc(l),calc(r+)));
return ;
}

[牛客挑战赛 30D] 小A的昆特牌 解题报告 (组合数学)的更多相关文章

  1. 牛客挑战赛30D 小A的昆特牌(组合数学)

    题面 传送门 题解 很容易写出一个暴力 \[\sum_{i=l}^r {i+n-1\choose n-1}{s-i+m\choose m}\] 即枚举选了多少个步兵,然后用插板法算出方案数 我们对这个 ...

  2. 【牛客挑战赛30D】小A的昆特牌(组合问题抽象到二维平面)

    点此看题面 大致题意: 有\(S\)张无编号的牌,可以将任意张牌锻造成\(n\)种步兵或\(m\)种弩兵中的一种,求最后步兵数量大于等于\(l\)小于等于\(r\)的方案数. 暴力式子 首先我们来考虑 ...

  3. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  4. 牛客挑战赛30-T3 小G砍树

    link 题目大意: n个节点的带标号无根树.每次选择一个度数为1的节点并将它从树上移除.问总共有多少种不同的方式能将这棵树删到只剩 1 个点.两种方式不同当且仅当至少有一步被删除的节点不同. 题解: ...

  5. nowcoder(牛客网)提高组模拟赛第一场 解题报告

    T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...

  6. nowcoder(牛客网)普及组模拟赛第一场 解题报告

    蒟蒻我可能考了一场假试 T1 绩点 这题没什么好说的,应该是只要会语言的就会做. T2 巨大的棋盘 一个模拟题吧qwq,但是要注意取模的时候先加上n或者m再取模,要不然会错的. #include< ...

  7. 牛客练习赛 小D的剑阵 解题报告

    小D的剑阵 题意链接: https://ac.nowcoder.com/acm/contest/369/F 来源:牛客网 现在你有 \(n\) 把灵剑,其中选择第i把灵剑会得到的 \(w_i\) 攻击 ...

  8. 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp

    LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...

  9. 牛客练习赛$48E$ 小$w$的矩阵前$k$大元素 堆

    正解:堆 解题报告: 传送门$QwQ$ 考虑把$b$从大往小排序,然后把$a_1+b_1,a_2+b_1,...,a_n+b_1$丢到堆里,顺便记录下$b$的下标 然后每次拿出一个最大值,设为$mx= ...

随机推荐

  1. [PHP][学习笔记][CURL]监测设备运行情况小demo

    1.curl获取的web content 不能直接echo到页面,会造成js各种错误 2.想办法处理字符串的截取.拼接 2.1.裁剪html返回的字符串 function cutStringFrom( ...

  2. AI.框架理论.语义网.语言间距.孤单

    刷个博客,转载自于科学网:AI.框架理论.语义网.语言间距.孤单 一:引言: AI几乎是计算机科学家的梦想,自动化比计算机发展的要早的多.早期的自动化节省了大量人力,激发了人类懒惰的滋长和对自身进化缓 ...

  3. c#日期计算

    /// <summary> /// 计算日期的间隔(静态类) /// </summary> public static class dateTimeDiff { /// < ...

  4. Objective-C类成员变量深度剖析--oc对象内存模型

    目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...

  5. ListUtil集合操作常用方法类

    * 集合操作常用方法类. * <p> * * @author 柯 */ public class ListUtil { /** * 判断List不为空,非空返回true,空则返回false ...

  6. 无需编写代码,API业务流程测试,零代码实现

    引言 除了测试单个接口,我们常常需要对多个有数据或者逻辑关联的接口进行业务流程测试,例如获取验证码-注册-登录.传统测试业务流程需要编写一系列测试代码,现在通过eoLinker全UI界面,无需编写任何 ...

  7. JDBC对MySQL数据库存储过程的调用

    一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用 ...

  8. eas之获取当前登陆信息

    public void getSystemInfo()    {        // SysContext工具类可获取当前登陆用户的信息,可根据需要进行调用.        // 举两例如下:     ...

  9. codeforces 466B Wonder Room(思维,暴力)

    题目 参考了别人的博客,百度来的博客 #include<iostream> #include<string> #include<stdio.h> #include& ...

  10. 【CF1173D】NanuuAndCircle

    题目链接:http://codeforces.com/contest/1173/problem/D 赛场上弱爆了的小菜鸡(本人),怎么也没想到这道看起来近似于神仙计数/生成函数的题正解竟然如此简洁. ...