【51NOD】1486 大大走格子
【算法】动态规划+组合数学
【题意】有一个h行w列的棋盘,定义一些格子为不能走的黑点,现在要求从左上角走到右下角的方案数。
【题解】
大概能考虑到离散化黑点后,中间的空格子直接用组合数计算。
然后解决容斥问题就很重要了。
定义f[i]为走到第i个黑点且不经过其它黑点的方案数。
f[i]=calc(x[i]-1,y[i]-1)-Σ(f[j]*calc(x[i]-x[j],y[i]-y[j])),j<i&&x[j]<=x[i]&&y[j]<=y[i]。
calc(n,m)表示向右n步,向下m步的方案数,即C(n+m,n)。
这个转移自带容斥功能,从另一方面考虑,一条路径到达黑点i,如果经过了若干黑点,那么只在它经过了第一个黑点的时候减去它。
那么f[i]减掉在其左上的所有f[j](再乘j走到i的路径数)就可以减去这样的所有路径了。
最后在右下角(h,w)增加一个黑点统计答案。
更多的想法参考:51nod1486 大大走格子 by mrazer
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=,MOD=1e9+;
int f[maxn],fac[],h,w,n;
struct cyc{int x,y;}a[maxn]; bool cmp(cyc a,cyc b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
void gcd(int a,int b,int &x,int &y){
if(!b){x=;y=;}
else{gcd(b,a%b,y,x);y-=x*(a/b);}
}
int inv(int a){
int x,y;
gcd(a,MOD,x,y);
return ((x%MOD)+MOD)%MOD;
}
int calc(int n,int m){return 1ll*fac[n+m]*inv(fac[n])%MOD*inv(fac[m])%MOD;}//1ll*
int main(){
scanf("%d%d%d",&h,&w,&n);
fac[]=;
for(int i=;i<=h+w;i++)fac[i]=1ll*fac[i-]*i%MOD;
for(int i=;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
a[++n]=(cyc){h,w};
sort(a+,a+n+,cmp);
f[]=;
for(int i=;i<=n;i++){
f[i]=calc(a[i].x-,a[i].y-);
for(int j=;j<i;j++)if(a[j].x<=a[i].x&&a[j].y<=a[i].y)f[i]=(f[i]+MOD-1ll*f[j]*calc(a[i].x-a[j].x,a[i].y-a[j].y)%MOD)%MOD;
}
printf("%d",f[n]);
return ;
}
【51NOD】1486 大大走格子的更多相关文章
- 51nod 1486 大大走格子(容斥原理)
1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有一个h行w列的棋盘,里面有一些格子是不能走的,现在要 ...
- 51Nod 1486 大大走格子 —— 组合数学
题目链接:https://vjudge.net/problem/51Nod-1486 1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: ...
- 51Nod 1486 大大走格子 —— 容斥
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 对于每个点,求出从起点到它,不经过其他障碍点的方案数: 求一 ...
- 51nod 1486 大大走格子——dp
有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数. Input 单组测试数据. 第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 20 ...
- 51nod 1486 大大走格子——容斥
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 已知起点到某个障碍点左上角的所有点的不经过障碍的方案数,枚举 ...
- 51nod 1486 大大走格子(DP+组合数学)
枚举不合法点的思想. 把障碍x坐标为第一关键字,y坐标为第二关键字排序.f[i]表示走到第i个障碍的方案数. f[i]=C(x[i]+y[i]-2,x[i]-1)-sigma(f[j]*C(x[i]- ...
- 51nod 1486 大大走格子(容斥+dp+组合数)
传送门 解题思路 暴力容斥复杂度太高,无法接受,考虑用\(dp\).设\(f(i)\)表示从左上角开始不经过前面的阻断点,只经过\(i\)的阻断点.那么可以考虑容斥,用经过\(i\)的总方案数减去前面 ...
- 51 Nod 1486 大大走格子
1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 有一个h行w列的棋盘,里面有一些格子是不 ...
- 51nod 1486
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 1486 大大走格子 题目来源: CodeForces 基准时间限 ...
随机推荐
- mysql 导入CSV数据 [转]
转自: http://blog.chinaunix.net/uid-23284114-id-3196638.html MYSQL LOAD DATA INFILE命令可以把csv平面文件中的数据导 ...
- APK反编译后添加日志
一.反编译 参考前一篇文章 二.添加寄存器(locals) 因为要添加日志,我们一般需要用一个变量来存储TAG,所以需要增加一个寄存器 如: # virtual methods .method pub ...
- python统计日志小脚本
日志格式如下: [ 2016-06-28T00:10:33-03:00 ] xxx.xx.xx.xxx /api/index/xxx/ ERR: code:400 message: params: c ...
- spring mvc 返回xml格式数据
1.问题 : 因为业务需要,需要发送xml格式的数据,使用spring mvc 自己解析,就不用费心去自己搞这些东西. 2.解决: 新建一个实体类,直接在实体类中添加注解即可,如下: @XmlRoot ...
- Qt 使用irrlicht(鬼火)3D引擎
项目中需要加载简单的3D场景.资深老前辈推荐使用开源小巧的引擎irrlicht. 关于irrlicht,来之百度百科 Irrlicht引擎是一个用C++书写的高性能实时的3D引擎,可以应用于C++程序 ...
- python 基础篇 14 程程器表达式 内置函数
昨日内容回顾 可迭代对象: 内部含有__iter__方法的就是可迭代对象. 可迭代对象不能取值,因为内部不含有__next__方法. 可迭代对象 ---> ...
- 安装VMware的一般步骤(安装过程总结)
(安装的是vmwareworkstation11以上) 0.遇到问题为没有权限打开服务“VMAuthdService”时,需要去管理->服务中打开对应的Windows Management In ...
- 【log4net】- 日志使用教程
一.log4net简介: 1. Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的 ...
- NOIP2018复赛 游记
Day -? 停了两个星期的课,逃了一场期中考试.随便做了点题并不知道有什么用.见不到夫人很难受. Day 0 依然没有跟学校走.据说今年合肥居然不下雨,印象里每年这个时候来到这里都是阴雨连绵……突然 ...
- hdu 1286 找新朋友 (欧拉函数)
找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...