T1:

题目描述

你正在使用过时的浏览器,洛谷暂不支持。 请 升级浏览器
以获得更好的体验!

Bob 来到了一个 $n \times m$ 的网格中,网格里有 $k$ 个豆子,第 $i$ 个豆子位于 $(x_i, y_i)$,保证没有两个豆子在同一个格子里,$(1, 1)$ 处和 $(n, m)$ 处没有豆子。

Bob 从左上角 $(1, 1)$ 出发,目的地是右下角 $(n, m)$。每次以向右或向下走一步,也就是说他到达终点时一共会走 $n + m - 2$ 步。

贪吃的 Bob 决定吃掉所有格子的豆子,他想知道是否存在多少条路径,使得他可以经过所有的豆子。由于答案很大,你只需要输出答案模 $10^9 + 7$ 的结果即可。

输入输出格式

输入格式:

第一行三个整数 $n, m, k$,意义如上所述。

接下来 $k$ 行,每行两个整数 $x_i, y_i(1 \leq x_i \leq n, 1 \leq y_i \leq m)$,意义如上所述。2018-10-14

输入输出样例

输入样例#1:

3 4 1
1 2
输出样例#1:

6
输入样例#2:

3 4 1
2 2
输出样例#2:

6

说明

对于 $30\%$ 的数据,满足 $2 \leq n, m \leq 100$。

对于 $60\%$ 的数据,满足 $2 \leq n, m \leq 1000$。

对于 $100\%$ 的数据,满足 $2 \leq n, m \leq 10^5, 0 \leq k \leq \min(n \times m - 2, 10^5)$。

 

解题思路:

由于要吃掉所有的豆子且只能向右向下走,那么对于每一个豆子来说,如果在当前豆子的严格左下方处仍有豆子的话肯定无解,因为不可能向左走。

因此我们可以以每个豆子的X坐标作为第一关键字,Y坐标作为第二关键字对豆子进行排序。

接下来考虑如何计算方案:

可以想到方案是由乘法原理得到的,即每个当前点去往下一个点的方案数的总乘积。

对于60%的数据我们可以用dp[i][j]表示到由(1,1)到(i,j)的方案数,直接计算即可。

100%的数据:将dp[i][j]的表打出来可以发现是杨辉三角的变形,也就是组合数,由于数据范围较大考虑用乘法逆元计算组合数。

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 100009
#define maxm 1009
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ll)(ch-'');ch=getchar();}
return x*f;
}
int n,m,k,tot;
struct node
{
int x,y;
}p[maxn];
ll ans,base; bool comp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
} ll Quick_mul(ll a,ll b)
{
ll sum=;
while(b)
{
if(b&)
sum=(sum*a)%base;
a=(a*a)%base;
b>>=;
}
return sum%base;
} ll inv(ll x)
{
return Quick_mul(x,base-)%base;
} ll Cal(ll n,ll m)
{
ll a=,b=;
for(ll i=n-m+;i<=n;i++)
a=(a*i)%base;
for(ll j=;j<=m;j++)
b=(b*j)%base;
return a*inv(b)%base;
} int main()
{
// freopen("T1.in","r",stdin);
// freopen("T1.out","w",stdout);
n=read(),m=read(),k=read(),base=1e9+;
if(k>n+m-)
{
puts("");
return ;
}
p[].x=,p[].y=;
for(int i=;i<=k;i++)
p[i].x=read(),p[i].y=read();
sort(p+,p++k,comp);
p[++k].x=n,p[k].y=m;
ans=;
for(int i=;i<=k;i++)
{
if(p[i].y<p[i-].y)
{
puts("");
return ;
}
ll x=(ll)p[i].x-p[i-].x+,y=(ll)p[i].y-p[i-].y+;
ans=ans*Cal(x+y-,y-)%base;
}
printf("%lld\n",ans);
fclose(stdin);
fclose(stdout);
return ;
}

  

  

Luogu 2018 秋令营 Test 2的更多相关文章

  1. [转帖] 国产x86-海光禅定 2018年营收过亿?

    中科曙光:全年业绩稳健,海光芯片营收过亿 X86服务器市场Intel占据绝对优势:X86处理器已经成为全球最广泛使用的处理器架构之一,尤其是在PC和服务器领域,其中在处理器市场的份额高达90%以上.中 ...

  2. 【微软2014实习生及秋令营技术类职位在线測试】题目2 : K-th string

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB Description Consider a string set that each of them consists of ...

  3. 微软2014实习生及秋令营技术类职位在线测试(题目1 : String reorder)

    题目1 : String reorder 时间限制:10000ms 单点时限:1000ms 内存限制:256MB Description For this question, your program ...

  4. Luogu 2017 Autumn Camping 游记

    颓得不行的我到D2才想起来自己可以写一篇low得不能再low的游记,然后就动笔了...... Day0 愉快地看着三联,想着别人放一天我放四天的悠闲生活,内心甚是平静.然而晚上回到家就开始浪了,看完了 ...

  5. [转帖]浪潮信息最大供应商英特尔(Intel):2018 年采购额 145.76 亿元

    浪潮信息最大供应商英特尔(Intel):2018 年采购额 145.76 亿元 https://t.cj.sina.com.cn/articles/view/3172142827/bd130eeb01 ...

  6. csp-j2019游记

    我一pj蒟蒻这点水平还来写游记? 算了,毕竟是第一次,记录一下吧 noip->csp 话说我跟竞赛是不是天生八字不合啊...... 小学的时候学小奥,等我开始报名比赛,当时似乎所有竞赛都被叫停了 ...

  7. Reduce inversion count 求最小逆序数

    本问题出自:微软2014实习生及秋令营技术类职位在线测试 (Microsoft Online Test for Core Technical Positions) Description Find a ...

  8. String reorder

    本问题出自:微软2014实习生及秋令营技术类职位在线测试 (Microsoft Online Test for Core Technical Positions) Description For th ...

  9. NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.

    洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...

随机推荐

  1. 谷歌浏览器Software Reporter Tool长时间占用CPU解决办法

    什么是Software Reporter Tool Software Reporter Tool是一个Chrome清理工具,用于清理谷歌浏览器中不必要或恶意的扩展,应用程序,劫持开始页面等等.当你安装 ...

  2. 解决response.setHeader("Content-disposition" 中文乱码问题

    Content-Disposition中文乱码 Response.setHeader(”Content-Disposition”, “attachment; filename=” + fileName ...

  3. [转] createObjectURL方法 实现本地图片预览

    ie6 可以直接显示本本地路径的图片 如: <img src="file://c:/3.jpg" />  ~~~网上都说ie7就不支持这种文件系统路径的url,但测试 ...

  4. Multidex(二)之Dex预加载优化

    Multidex(二)之Dex预加载优化 https://www.jianshu.com/p/2891599511ff

  5. LeetCode高频148错题记录

    3. Max Points on a Line 共线点个数3种解法 思路一:思考如何确定一条直线,两点法,确定斜率后带入一点.有三种情况,1. 两点重合,2. 斜率不存在,3. 正常算,依次以每个点为 ...

  6. 【BZOJ2560】串珠子

    题解: 跟n个点有标号的无向连通图个数几乎一模一样 直接上代码了 代码: #include <bits/stdc++.h> using namespace std; #define ll ...

  7. [转]基于国家标准的 EndNote 输出样式模板 ----直接用endnote导入到word,不用自己一个个改参考文献了

    EndNote 相当于一个数据库,将添加/导入的文献存档.需要引用文献的时候就从中选择一个插入到文档中,EndNote 会自动给你编号.在文档末尾建立相应的参考文献列表.但是各种杂志.单位要求的文献著 ...

  8. ssh登录报错-bash fork retry Resource temporarily unavailable

  9. 解决 jQuery 实现父窗口的问题 如window.parent.document.getElementById().innerHTML

    因为先前遇到的问题,所以我考虑采用 IFRAME 来隔离不同的脚本,从而实现我需要的效果. 在框架中,我用 JavaScript 获取 JSON 数据,组织成 HTML 代码,最后将其填充至上层文档的 ...

  10. gitlab之五: gitlab之webhook

    webhook(网络钩子),一般与jenkins联合使用,gitlab的某个项目的代码更新了后就触发 webhook中配置的 url ,这个url一般是某一个jienkins中某一个job的url.即 ...