题目描述

某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。

现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >= y,

请问在这些前提下,到达B(n, m)有多少种走法。

输入格式

仅有一行,包含两个整数 n 和 m,表示城市街区的规模。

输出格式

仅有一个整数和一个换行/回车符,表示不同的方案总数。

样例

样例输入

6 6

样例输出

132

数据范围与提示

对于全部数据,1≤m≤n≤5000。

卡特兰数折线表示:

n=m:

n>m:

博主很懒连打字都不想打了

好吧其实n=m时你会发现是卡特兰数,当n>m时,我们把黑色沿绿线翻折,得到另一块黑色,

如果我们只用卡特兰数,会算上紫框里的部分(由a到c),所以减去

n=m也是一样,只是式子化简一下就是卡特兰数

用到高精,高精你会TLE,所以要把式子化简一下

没啥可说的,普及一下CATALAN数

卡特兰数是组合数学中经常出现在计数问题的数列,

满足:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)

另一种递推公式:h(n)=$\frac{(n-1)*(4*n-2)}{n+1}$

通项公式:h(n)=$C_{2*n}^{n}-C_{2*n}^{n-1}$

     h(n)=$\frac{C_{2*n}^{n}}{n+1}$

应用:

出栈次序是卡特兰数的一个应用。

我们将入栈视为+1,出栈视为-1,则限制条件为在任意位置前缀和不小于0 。

我们讨论这个问题与卡特兰数有什么关系。

为了方便,我们按入栈的先后顺序将各个元素由1到n编号。

假设最后一个出栈的数为k。 则在k入栈之前,比k小的数一定全部出栈,所以这部分方案数为h(k-1)。

在k入栈之后,比k大的数在k入栈之后入栈,

在k出栈之前出栈,所以这部分的方案数为h(n-k)。

这两部分互不干扰,则方案数为h(k-1)*h(n-k) 枚举k,得到的公式就是卡特兰数的递推公式。

卡特兰数的应用

  括号匹配

  二叉树计数

  有限制的网格路径数

好了先普及这些,放代码:

#include<bits/stdc++.h>
#define re register
#define MAXN 50005
using namespace std;
int n,m;
struct node{
int m[MAXN];
node(){memset(m,0,sizeof(m));}
inline friend void operator *= (node &a,re int b){
int x=0;
for(re int i=1;i<=a.m[0];i++){
re int y=a.m[i]*b+x;
a.m[i]=y%10;
x=y/10;
}
while(x){
a.m[++a.m[0]]=x%10;
x/=10;
}
}
inline friend void operator /= (node &a,re int b){
re int x=0;
for(re int i=a.m[0];i>=1;i--){
x+=a.m[i];
a.m[i]=x/b;
x%=b;
x*=10;
}
while(a.m[a.m[0]]==0&&a.m[0]>1)
a.m[0]--;
}
inline friend node operator - (node a,node b){
node c;
re int i=1;
while((i<=a.m[0])||(i<=b.m[0])){
if(a.m[i]<b.m[i]){
a.m[i]+=10;
a.m[i+1]--;
}
c.m[i]=a.m[i]-b.m[i];
i++;
}
while(c.m[i]==0&&i>1)
i--;
c.m[0]=i;
return c;
}
inline friend void print(node a){
for(re int i=a.m[0];i>=1;i--)
printf("%d",a.m[i]);
puts("");
}
}x;
int main(){
scanf("%d%d",&n,&m);
x.m[0]=x.m[1]=1;
for(re int i=m+1;i<=n+m;i++) x*=i;
x*=(n-m+1);
for(re int i=2;i<=n+1;i++) x/=i;
print(x);
return 0;
}

BZOJ3907 网格 卡特兰数的更多相关文章

  1. 卡特兰数 BZOJ3907 网格 NOIP2003 栈

    卡特兰数 卡特兰数2 卡特兰数:主要是求排列组合问题 1:括号化矩阵连乘,问多少种方案 2:走方格,不能过对角线,问多少种方案 3:凸边型,划分成三角形 4:1到n的序列进栈,有多少种出栈方案 NOI ...

  2. bzoj3907 网格 & bzoj2822 [AHOI2012]树屋阶梯——卡特兰数+高精度

    题目:bzoj3907:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 bzoj2822:https://www.lydsy.com/Jud ...

  3. 卡特兰数-Catalan数

    卡特兰数的含义: 说到卡特兰数,就不得不提及卡特兰数序列.卡特兰数序列是一个整数序列.其通项公式是我们从中取出的就叫做第n个卡特兰数数,前几个卡特兰数数是:1, 1, 2, 5, 14, 42, 13 ...

  4. 「刷题」卡特兰数&prufer序列

    1.网格 转换模型,翻折容斥出解. 2.有趣的数列 抽象一下模型,把奇数项当作横坐标,偶数项当作纵坐标,就是从n*n矩阵左下角走到右上角并且每一步x<=y的方案数,发现是卡特兰数,关于gcd,可 ...

  5. 浅谈 Catalan number——卡特兰数

    一.定义: 卡特兰数是一组满足下面递推关系的数列: 二.变形: 首先,设h(n)为Catalan数的第n+1项,令h(0)=1,h(1)=1,Catalan数满足递推式: h(n)= h(0)*h(n ...

  6. 卡特兰数(catalan)总结

    卡特兰数的公式 递推公式1:$f(n)=\sum \limits_{i=0}^{n-1}f(i)*f(n-i-1)$ 递推公式2:$f(n)=\frac{f(n-1)*(4*n-2)}{n+1}$ 组 ...

  7. 卡特兰数 洛谷P1641 [SCOI2010]生成字符串

    卡特兰数 参考博客 介绍 卡特兰数为组合数学中的一种特殊数列,用于解决一类特殊问题 设\(f(n)\)为卡特兰数的第n项 其通项公式为 \[f(n)=\frac{2n\choose n}{n+1} \ ...

  8. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

  9. 卡特兰数(Catalan)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, ...

随机推荐

  1. QQ空间批量删除说说

    按下F12,贴下如下代码 var delay = 1000; function del() { if (document.querySelector(".app_canvas_frame&q ...

  2. Hibernate与数据库交互方式和Hibernate常用的几个方法

    第一种,适合sql语言水平比较高的人用 HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分 ...

  3. kubernetes istio的快速安装和使用例子

    安装 [root@master ~]# wget https://github.com/istio/istio/releases/download/1.1.5/istio-1.1.5-linux.ta ...

  4. [VS2008] Debug版本程序发布后 由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题

    转自VC错误:http://www.vcerror.com/?p=59 问题描述: [VS2008] 版本程序发布后,运行程序弹出错误框: 由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序 ...

  5. VS2010-MFC(常用控件:列表框控件ListBox)

    转自:http://www.jizhuomi.com/software/186.html 列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示.列表框可分为单 ...

  6. P3338 [ZJOI2014]力 /// FFT 公式转化翻转

    题目大意: https://www.luogu.org/problemnew/show/P3338 题解 #include <bits/stdc++.h> #define N 300005 ...

  7. 使用CEfSharp之旅(2) js前台事件执行后台方法

    原文:使用CEfSharp之旅(2) js前台事件执行后台方法 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群里问 https://blo ...

  8. 输出内容 document.write() 可用于直接向 HTML 输出流写内容。简单的说就是直接在网页中输出内容

    输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用""括起,直 ...

  9. 跟我一起使用create-react-app脚手架搭建vw-layout解决方案

    之前也是看过大漠的vw适配Vue-cli,我自己写H5,还有使用vue做项目的时候,会搭建大漠博客中的那一套. 现在在github上面,看见了一位博主使用create-react-app也是用vw适配 ...

  10. Android开发 LevelListDrawable详解

    前言 此篇博客正在施工中... 作者其实就是想挖个坑备忘一下... 十分抱歉, 可以参考https://www.jianshu.com/p/f9ec65241b6b