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. KVO的使用及底层实现

    1.概念 KVO(Key-Value-Observer)也就是观察者模式,是苹果提供的一套事件通知机制.允许对象监听另一个对象特定属性的改变,并在改变时接收到事件,一般继承自NSObject的对象都默 ...

  2. C# FormClosing FormClosed 区别详解

    FormClosing事件 在窗体关闭时,FormClosing事件发生.此事件会得到处理.从而释放与窗体相关的所有资源. 如果取消此事件,则窗体仍然保持打开状态. 当窗体显示为模式对话框时,单击“关 ...

  3. jQuery+pjax简单示例汇总

    pjax 是一个jQuery插件,它使用 ajax 和 pushState 来实现快速的浏览体验,包括真正的固定链接,页面标题和工作返回按钮. ajax缺点是破坏了浏览器的前进后退,因为ajax的请求 ...

  4. iOS https 证书链获取

    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)chall ...

  5. codeforces 427D Match & Catch(后缀数组,字符串)

    题目 参考:http://blog.csdn.net/xiefubao/article/details/24934617 题意:给两个字符串,求一个最短的子串.使得这个子串在两个字符串中出现的次数都等 ...

  6. SSH(远程登录)

    在linux中SSH服务对应两个配置文件: ssh特点:在传输数据的时候,对文件加密后传输. ssh作用:为远程登录会话和其他网络服务提供安全性协议. ssh小结: 1.SSH是安全的加密协议,用于远 ...

  7. JavaSE 学习笔记之封装(四)

    封 装(面向对象特征之一):是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处:将变化隔离:便于使用:提高重用性:安全性. 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共 ...

  8. dubbo-源码阅读之bean装配过程(四)

    Spring自定义schema 我们再使用dubbo进行时 会经常看到这样的标签 <!--开启注解扫描--> <context:component-scan base-package ...

  9. BA-WG-冷源

    冷源群控系统最好由冷源厂家来做的理由 1.冷机厂家对空调的参数十分的清楚,明确的知道冷机的负荷曲线,可以优化冷机加减载的最合理时间达到最佳的节能效果 2.独立的CSM硬件模块,内置不同冷机的型号特性, ...

  10. RONOJ——PID204 / 特种部队 ☆

    题目描述 某特种部队接到一个任务,需要潜入一个仓库.该部队士兵分为两路,第一路士兵已经在正面 牵制住了敌人,第二路士兵正在悄悄地从后方秘密潜入敌人的仓库. 当他们到达仓库时候,发现这个仓库的锁是一把很 ...