题目描述

lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数。现在lxhgww想要知道满足要求的字符串共有多少个,聪明的程序员们,你们能帮助他吗?

输入

输入数据是一行,包括2个数字n和m

输出

输出数据是一行,包括1个数字,表示满足要求的字符串数目,这个数可能会很大,只需输出这个数除以20100403的余数

样例输入

2 2

样例输出

2

提示

【数据范围】
对于30%的数据,保证1<=m<=n<=1000
对于100%的数据,保证1<=m<=n<=1000000

将选$1$看成往右走,选$0$看成往上走,那么要求的就是从$n*m$的网格的左下角走到右上角且不能穿过$y=x$的方案数。

将不能穿过$y=x$看成不能走到$y=x+1$,答案就是总方案数(即没有不能穿过$y=x$限制的方案数)-走到$y=x+1$的方案数。

将起点关于$y=x+1$对称到$(-1,1)$,那么走到$y=x+1$的方案数就是从$(-1,1)$走到$(n,m)$只能往右和往上走的方案数。

最终答案就是$C_{n+m}^{n}-C_{n+m}^{n+1}$,注意当$n<m$时答案为$0$。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=20100403;
int n,m;
int fac[2000010];
int inv[2000010];
int C(int n,int m)
{
return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
scanf("%d%d",&n,&m);
inv[0]=inv[1]=fac[0]=fac[1]=1;
for(int i=2;i<=n+m;i++)
{
fac[i]=1ll*fac[i-1]*i%mod;
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
}
for(int i=2;i<=n+m;i++)
{
inv[i]=1ll*inv[i-1]*inv[i]%mod;
}
if(n>=m)
{
printf("%d",(C(n+m,n)-C(n+m,n+1)+mod)%mod);
}
else
{
printf("0");
}
}

最新文章

  1. SAP 订单状态跟踪
  2. leetcode 165
  3. vuejs 和 element 搭建的一个后台管理界面
  4. reactjs学习一(环境搭配react+es6+webpack热部署)
  5. bootstrap实现pc屏幕五等分
  6. 添加删除程序无法安装IIS 提示没法加载模块
  7. linux下使用split 来分割大文件
  8. 如何把textfield或者textview中长按出现的(全选,复制,粘贴)显示成中文
  9. C语言学习笔记--指针与字符串
  10. 《HTML 5网页开发实例具体解释》文件夹
  11. 不用库(框架),自己写ajax
  12. Unity3D脚本--真实1
  13. [译]ava 设计模式之构造器
  14. Oracle的闪回技术--闪回错误的DML操作
  15. Unity 3D Framework Designing(8)——使用ServiceLocator实现对象的注入
  16. Yii 2.0 数据库操作总结
  17. JavaScript基础2——关于变量
  18. node,npm,vue的全局升级
  19. POJ3090 Visible Lattice Points (数论:欧拉函数模板)
  20. C/C++ 之输入输出

热门文章

  1. 定时任务cron表达式详解
  2. ip地址 与子网掩码 的计算
  3. Dijkstra+Heap模板
  4. JAVA操作ORACLE大对象
  5. python路径相关处理
  6. for循环的耗时问题
  7. C#导出和导入Excel模板功能
  8. 分布式Hadoop和HBase整合
  9. CH6201 走廊泼水节[最小生成树]
  10. reverse函数的实现