大家说他是卡特兰数,其实也不为过,一开始只是用卡特兰数来推这道题,一直没有怼出来,后来发现其实卡特兰数只不过是一种组合数学,我们可以退一步直接用组合数学来解决,这道题运用组合数的思想主要用到补集与几何法。

假设以矩形左下角为坐标原点,(以下所说路径均满足只能向右或向上走),我们假设原矩阵为a,那么他关于l(y=x+1),对称矩形就是b(黑色),那么出现了c矩阵,他的长为n+1,宽为m-1,易知从(0,0)到(n,m)(a右上角)的路径(在矩形a内)的种数就是C(n+m,m),然后我告诉你从(0,0)到(m-1,n+1)(c右上角)的路径(在矩形c内)种数C(n+m,m-1),就是原矩阵中不合法路径个数,你不信很正常.....

那么让我们想一下。从(0,0)到(n,m)的不合法路径(在矩形a内)一定满足若干次碰到了l与a围成的三角型的边界之一——l在a内部分,然后在最后一次碰到后离开并驶向(n,m),从(0,0)到(m-1,n+1)的路径(在矩形c内)均满足若干次碰到了l与a围成的三角型,然后在最后一次碰到后离开并驶向(m-1,n+1),再然后我们发现在“离开”之前的走法满足以上两种路径可以吻合,那么“离开“之后呢——他离开时一定最后与l交于一点,那么我们发现在l上的任意整点(在a内部分)与(n,m)和(m-1,n+1)分别作为两个对角点形成的矩形全等,于是从一角到另一角的方案一一对应,于是证毕。

#include <cstdio>
#include <cstring>
const int P=;
struct Bigint{
int a[];
Bigint(){a[]=a[]=;}
inline friend Bigint operator - (Bigint a,Bigint b);
inline friend Bigint operator * (Bigint a,int b);
inline void operator -= (Bigint b){(*this)=(*this)-b;}
inline void operator *= (int b){(*this)=(*this)*b;}
inline void print();
}ans1,ans2;
inline void Bigint:: print(){
printf("%d",a[a[]]);
for(int i=a[]-;i>;--i)
printf("%04d",a[i]);
}
inline Bigint operator - (Bigint a,Bigint b){
for(int i=;i<=a.a[];++i){
a.a[i]-=b.a[i];
if(a.a[i]<)
a.a[i]+=P,a.a[i+]--;
}
while(a.a[a.a[]]==)a.a[]--;
return a;
}
inline Bigint operator * (Bigint a,int b){
int last=;
for(int i=;i<=a.a[];++i)
a.a[i]=a.a[i]*b+last,last=a.a[i]/P,a.a[i]%=P;
if(last)a.a[++a.a[]]=last;
return a;
}
int n,m;
int prime[P+],len,mini[P+];
bool isnot[P+];
inline void get_prime(){
for(int i=;i<=P;++i){
if(isnot[i]==false)prime[++len]=i,mini[i]=len;
for(int j=;prime[j]*i<=P;++j){
isnot[prime[j]*i]=true,mini[prime[j]*i]=j;
if(i%prime[j]==)break;
}
}
}
int size[P];
int main(){
scanf("%d%d",&n,&m),get_prime();
for(int i=n+m,x;i>n;--i){
x=i;
while(mini[x])
++size[mini[x]],x/=prime[mini[x]];
}
for(int i=,x;i<=m;++i){
x=i;
while(mini[x])
--size[mini[x]],x/=prime[mini[x]];
}
for(int i=;i<=len;++i)
while(size[i])
ans1*=prime[i],--size[i];
for(int i=n+m,x;i>n+;--i){
x=i;
while(mini[x])
++size[mini[x]],x/=prime[mini[x]];
}
for(int i=,x;i<m;++i){
x=i;
while(mini[x])
--size[mini[x]],x/=prime[mini[x]];
}
for(int i=;i<=len;++i)
while(size[i])
ans2*=prime[i],--size[i];
ans1-=ans2;
ans1.print();
return ;
}

【BZOJ 3907】网格 组合数学的更多相关文章

  1. bzoj 3907: 网格 组合数学

    3907: 网格 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 13  Solved: 7[Submit][Status][Discuss] Descr ...

  2. BZOJ 3907: 网格( 组合数 + 高精度 )

    (0,0)->(n,m)方案数为C(n,n+m), 然后减去不合法的方案. 作(n,m)关于y=x+1的对称点(m-1,n+1), 则(0,0)->(m-1,n+1)的任意一条路径都对应( ...

  3. BZOJ 3907: 网格 [Catalan数 高精度]

    3907: 网格 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 402  Solved: 180[Submit][Status][Discuss] De ...

  4. BZOJ 3907: 网格【组合数学】

    Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过 ...

  5. BZOJ 3907: 网格

    Description 求不跨过直线 \(y=x\) ,到达 \((n,m)\) 的方案数. Sol 组合数学+高精度. 这个推导过程跟 \(Catalan\) 数是一样的. 答案就是 \(C^{n+ ...

  6. bzoj 3907 网格 bzoj2822 [AHOI2012]树屋阶梯——卡特兰数(阶乘高精度模板)

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

  7. 【BZOJ 3907】网格(Catalan数)

    题目链接 这个题推导公式跟\(Catalan\)数是一样的,可得解为\(C_{n+m}^n-C_{n+m}^{n+1}\) 然后套组合数公式\(C_n^m=\frac{n!}{m!(n-m)!}\) ...

  8. BZOJ 3997: [TJOI2015]组合数学 [偏序关系 DP]

    3997: [TJOI2015]组合数学 题意:\(n*m:\ n \le 1000\)网格图,每个格子有权值.每次从左上角出发,只能向下或右走.经过一个格子权值-1.至少从左上角出发几次所有权值为0 ...

  9. BZOJ 3997 [TJOI2015]组合数学(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题目大意] 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右 ...

随机推荐

  1. ctf题目writeup(6)

    2019.2.2 依旧是bugku上面的题目,地址:https://ctf.bugku.com/challenges 1. 解压后是60多个out.zip,都是真加密,里面都是1kb的data.txt ...

  2. 【GUI】一、Swing外观框架BeautyEye使用

    一.Swing外观框架BeautyEye使用 1.1 导包 BeautyEye.jar 1.2 使用BeautyEye L&F public static void main(String[] ...

  3. 基于STM32F103的Max30100心率、血氧检测代码(转载)

    MAX30100是能够读取心率.血氧的传感器,通信方式是通过IIC进行通信.其工作原理是通过红外led灯照射,能够得到心率的ADC值.       MAX30100的寄存器可以分为五类,状态寄存器.F ...

  4. STL——map和set

    一.map 1.map被定义为一对(pair即key和value)数值. key值在map内最多只有一份. 假如需要对一篇文章中的单词计数,那么就可以建立一个map,string类型的key,int型 ...

  5. Matplotlib 子图的创建

    在matplotlib中,整个图像为一个Figure对象 在Figure对象中可以包含一个或者多个Axes对象  每个Axes对象相当于一个子图了 每个Axes(ax)对象都是一个拥有自己坐标系统的绘 ...

  6. CUBLAS基础实验

    一.概述 最近在试图进行cuda并行编程,目标是编写一段矩阵计算代码,将计算结果存储进入GPU的缓冲区当中,并在达到某些要求后强制刷新缓冲区,取得计算结果. 但是考虑时间紧任务重的状况和实际的性能要求 ...

  7. ProxySQL读写分离测试(续)

      Preface       I've implemented ProxySQL on PXC yesterday but got some errors when configured query ...

  8. 基于阿里云服务器Linux系统部署JavaWeb项目

    前段时间刚完成一个JavaWeb项目,想着怎么部署到服务器上,边学边做,花了点时间终于成功部署了,这里总结记录一下过程中所遇到的问题及解决方法.之所以选择阿里云,考虑到它是使用用户最多也是最广泛的云服 ...

  9. Charles的Https抓包及弱网配置

    一.Charles的主要功能 (1)截取Http 和 Https 网络封包. (2)支持重发网络请求,修改请求参数,方便后端调试. (3)支持模拟弱网环境. 二.配置简单抓包 1.设置系统代理:勾选P ...

  10. 推荐5个机器学习Python 库,国内外评价超高

    机器学习令人无比神往,但从事这个工作的人可能并不这么想. 机器学习的工作内容往往复杂枯燥又困难——通过大量重复工作进行提升必不可少: 汇总工作流及传输渠道.设置数据源以及在内部部署和云部署的资源之间来 ...