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. Android学习——数据存储之文件存储

    将数据存储到文件中并读取数据 1.新建FilePersistenceTest项目,并修改activity_main.xml中的代码,如下:(只加入了EditText,用于输入文本内容,不管输入什么按下 ...

  2. C#调用Java的WebService出现500 服务器错误

    最近在用C#调用Java写的WebService时,发现老是返回500 服务器错误,到底什么原因一直找不出来, 后来google了以后,找到国外的http://stackoverflow.com站点已 ...

  3. RRDtool入门详解

    ---------------原创内容,转载请注明出处.<yaoyao0777@Gmail.com>------------ 一.概述 RRDtool(round-robin databa ...

  4. VMWare linux 打印太多,看不到之前的记录的解决方法总结

    1.在命令后面加 | more. 可以每次按空格键或是回车键后翻.2.命令后面加| less ,可以前后翻.3.用重定向到文件 > 文件名,之后慢慢看 ----待补充 ------

  5. CXF-JAX-RS开发(二)spring整合CXF-JAX-RS

    一.创建maven工程[Packaging:war] 1.目录结构 2.坐标书写 二.导入依赖和tomcat服务器插件 <dependencies> <!-- CXF --> ...

  6. 参加EMCL感想

    ECML,全名为欧洲机器学习会议,European Conference on Machine Learning 原文链接:http://blog.sina.com.cn/s/blog_59388e2 ...

  7. 【sqli-labs】 less7 GET - Dump into outfile - String (导出文件GET字符型注入)

    使用此漏洞需要知道WEB程序的根路径并且MYSQL的secure-file-priv配置应为可写入该路径 添加单引号,发现错误被屏蔽 对应的SQL语句应为 ')) ... 字段还是3个 在数据库中执行 ...

  8. HDU_1850_nim游戏

    Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  9. Step by Step 开发dynamics CRM

    这里是作为开发贴的总结. 现在plugin和workflow系列已经终结. 希望这些教程能给想入坑的小伙伴一些帮忙. CRM中文教材不多, 我会不断努力为大家提供更优质的教程. Plugin 开发系列 ...

  10. 移动pc常用Meta标签

    移动常用 <meta charset="UTF-8"> <title>{$configInfos['store_title']}</title> ...