博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1486 大大走格子
阅读量:5063 次
发布时间:2019-06-12

本文共 1023 字,大约阅读时间需要 3 分钟。

2333良心题,,,

不带障碍是很简单的,就是一个C(n+m,n)就是方案数,然而有了障碍怎么办呢。。。

设f[i]为走到第i个障碍点且合法的方案数。(当然,首先把这些障碍排一下序)

用类似与容斥的思想,首先让f[i]=C(a[i].x+a[i].y,a[i].x)(这里的a表示点),然后考虑要减掉什么。

枚举之前的障碍点,那么走过这个点 j 到第 i 点的方案数就是 f[j]*C(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x),那么减掉就好了。

现在考虑如果走多个障碍点呢?

然而经过一番考虑之后发现这个问题是不用考虑的。

为什么呢?因为是酱紫的,

而且C(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x)这部分,是 j 点到 i 点的全部路径,也就是说,包含了所有一个点,2个点在内的情况,

而我们枚举的 j 点就相当于枚举了障碍序列的开头的第一个障碍(f[j]是我们处理好了的东西, 也就是说,我们的f[j]就保证了从原点走到 j 点是没有障碍点),所以就可以枚举所有的障碍排列,也就是全部减去了。

奥妙重重2333

1 #include 
2 #define LL long long 3 using namespace std; 4 5 const int mod=1000000007; 6 const int maxn=100005; 7 8 int f[maxn],inv[maxn<<1],fac[maxn<<1]; 9 int n,m,k;10 11 struct node{12 int x,y;13 }a[maxn];14 bool cmp(node a, node b) {
return a.x==b.x?a.y
=a[j].y) 38 f[i]=(f[i]-(LL)C(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x)*f[j]%mod+mod)%mod;39 }40 cout<
<

 

转载于:https://www.cnblogs.com/ccd2333/p/6731895.html

你可能感兴趣的文章
Java8 lambda表达式10个示例
查看>>
生信相关网站
查看>>
实训作业lO流
查看>>
M2 Postmortem
查看>>
PySpark调用自定义jar包
查看>>
Example config file /etc/vsftpd.conf
查看>>
Django实战,小网站实现增删改查
查看>>
Python学习总结一
查看>>
【文件】读取一个文件夹下所有的jpg图片
查看>>
【目录】编程题目
查看>>
Hexo NexT 博客后台管理指南
查看>>
java基础
查看>>
关于如何在其他包中写controller和简单介绍@SpringBootApplication
查看>>
479. Largest Palindrome Product
查看>>
python学习笔记04-了解操作符与条件分支
查看>>
点滴记录——Ubuntu 14.04中Solr与Tomcat整合安装
查看>>
IOS 11 通讯录手机号「隐形字符」的 Bug
查看>>
Solr搜索分页
查看>>
数据预处理-机器学习
查看>>
CSS基础学习-4.CSS属性_背景、颜色、边框
查看>>