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

假设以矩形左下角为坐标原点,(以下所说路径均满足只能向右或向上走),我们假设原矩阵为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】网格 组合数学的更多相关文章
- bzoj 3907: 网格 组合数学
3907: 网格 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 13 Solved: 7[Submit][Status][Discuss] Descr ...
- 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)的任意一条路径都对应( ...
- BZOJ 3907: 网格 [Catalan数 高精度]
3907: 网格 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 402 Solved: 180[Submit][Status][Discuss] De ...
- BZOJ 3907: 网格【组合数学】
Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过 ...
- BZOJ 3907: 网格
Description 求不跨过直线 \(y=x\) ,到达 \((n,m)\) 的方案数. Sol 组合数学+高精度. 这个推导过程跟 \(Catalan\) 数是一样的. 答案就是 \(C^{n+ ...
- bzoj 3907 网格 bzoj2822 [AHOI2012]树屋阶梯——卡特兰数(阶乘高精度模板)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 https://www.lydsy.com/JudgeOnline/problem.p ...
- 【BZOJ 3907】网格(Catalan数)
题目链接 这个题推导公式跟\(Catalan\)数是一样的,可得解为\(C_{n+m}^n-C_{n+m}^{n+1}\) 然后套组合数公式\(C_n^m=\frac{n!}{m!(n-m)!}\) ...
- BZOJ 3997: [TJOI2015]组合数学 [偏序关系 DP]
3997: [TJOI2015]组合数学 题意:\(n*m:\ n \le 1000\)网格图,每个格子有权值.每次从左上角出发,只能向下或右走.经过一个格子权值-1.至少从左上角出发几次所有权值为0 ...
- BZOJ 3997 [TJOI2015]组合数学(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题目大意] 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右 ...
随机推荐
- Hadoop(2)--hdfs
Hadoop(2) Hadoop底层封装的的是HDFS和MapReduce两种框架 在Hdfs中采用的是主从结构(Madter-slaver)就像领导和员工一样,领导负责整个公司的管理工作,而员工就负 ...
- 【Thrift一】Thrift安装部署
Thrift安装部署 Thrift安装部署 下载源码包 安装g++ 解压Thrift安装包 安装boost开发工具 测试(python版) 下载源码包 wget http://apache.fayea ...
- Fibonacci使用递归和循环实现
#include<stdio.h> double Fibonacci(int i); double Fibonacci_(int i); int main(void) { int i; p ...
- 从0开始 java 网站开发(jsp)【1】
前提:安装java 并配置环境变量 java下载地址: http://www.java.com/zh_CN/ 环境变量配置 本地PC路径: 电脑--属性--高级--环境变量 在系统变量中: 新建 名: ...
- scrapy编写爬虫的时候出现缺少win32api
环境:python3.6 工具:pycharm2017.3 scrapy fetch http://www.baidu.com ModuleNotFoundError: No module named ...
- P2966 [USACO09DEC]牛收费路径Cow Toll Paths
P2966 [USACO09DEC]牛收费路径Cow Toll Paths 题目描述 Like everyone else, FJ is always thinking up ways to incr ...
- vs13发布web程序 iis上
一.配置iis 1,找到控制面板--程序--启用或关闭Windows功能 2,从列表中选择Internet Infomation Services,并且把相应的功能条目勾选上,如果不清楚,可以全部选中 ...
- 使用Entity Framework出错
在使用的过程中,写了一个例子,结果就报错说 The context cannot be used while the model is being created. 在 ...
- abo dto属性验证的坑
问题回现: public class ShipmentRequestDto { public string FromPhoneNumber { get; set; } /// <summary& ...
- Linux下创建pycharm的快捷方式
第一步:创建桌面快捷方式文件Pycharm.desktop,并打开 sudo gedit /usr/share/applications/Pycharm.desktop 第二步:在打开的文件Pycha ...