同BZOJ 3782 上学路线

QAQ 还比那个简单一点

把坐标(1,1)-(n,m)平移成(0,0)-(n-1,m-1)

设dp[i]表示从(1,1)出发第一次经过障碍且到达第i个障碍的方案数

首先到达第i个障碍的方案数为C(x+y,x)

之后我们考虑i是第一个经过的障碍的方案数=到达i的方案数-i不是第一个经过的障碍的方案数

这也是很好算的

容斥一下即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std; typedef long long LL;
const int maxn=100010;
const int mod=1e9+7;
int n,m,k,lim;
struct blo{
int x,y;
}c[2010];
bool cmp(const blo &A,const blo &B){
if(A.x==B.x)return A.y<B.y;
return A.x<B.x;
} LL fac[maxn<<1];
LL inv[maxn<<1];
LL pow_mod(LL v,int p){
LL tmp=1;
while(p){
if(p&1)tmp=tmp*v%mod;
v=v*v%mod;p>>=1;
}return tmp;
}
LL C(int n,int m){return fac[n]*inv[m]%mod*inv[n-m]%mod;} LL dp[2010];
void Get_DP(){
for(int i=1;i<=k;++i){
dp[i]=C(c[i].x+c[i].y,c[i].x);
for(int j=1;j<i;++j){
if(c[j].x<=c[i].x&&c[j].y<=c[i].y){
dp[i]=dp[i]-dp[j]*C(c[i].x+c[i].y-c[j].x-c[j].y,c[i].x-c[j].x)%mod;
if(dp[i]<0)dp[i]+=mod;
}
}
}printf("%I64d\n",dp[k]);
} int main(){
scanf("%d%d%d",&n,&m,&k);lim=n+m-2;
for(int i=1;i<=k;++i){
scanf("%d%d",&c[i].x,&c[i].y);
c[i].x--;c[i].y--;
}
fac[0]=1;k++;c[k].x=n-1;c[k].y=m-1;
for(int i=1;i<=lim;++i)fac[i]=fac[i-1]*i%mod;
inv[lim]=pow_mod(fac[lim],mod-2);
for(int i=lim-1;i>=0;--i)inv[i]=inv[i+1]*(i+1)%mod;
sort(c+1,c+k+1,cmp);Get_DP();
return 0;
}

  

codeforces #313 div1 C的更多相关文章

  1. codeforces #313 div1 E

    首先我们要注意到一个事情 如果一个灯塔向左覆盖,那么比他小的某个灯塔如果向左覆盖的端点大于当前塔向左覆盖的端点,他一定向右覆盖 对于当前灯塔向右覆盖也是同理 那么我们只需要记录当前覆盖到的端点就可以完 ...

  2. codeforces #313 div1 D

    好神的题目! 首先我们运用pick定理A=S-B/2+1将要求的东西转化掉 之后分离变量,我们变成了求选取凸包面积的期望和求选取凸包在边界上的点的期望 我们先考虑求选取凸包面积的期望 如何计算凸多边形 ...

  3. codeforces #313 div1 B

    模拟判定就可以了 判定字符串是否相等用hash来判断 QAQ 值得一提的是一开始我交的时候T了 结果我将递归的顺序调整了一下就A了 (并不知道为什么 #include<cstdio> #i ...

  4. codeforces #313 div1 A

    捕获一只野生大水题! 首先我们知道边长为L的正三角形含有边长为1的小正三角形为L^2个 那么我们可以通过在六边形的正上,左下,右下补充正三角形使得原图形变成正三角形 然后再将补充的减去即可 #incl ...

  5. codeforces 407 div1 B题(Weird journey)

    codeforces 407 div1 B题(Weird journey) 传送门 题意: 给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环.问满 ...

  6. codeforces 407 div1 A题(Functions again)

    codeforces 407 div1 A题(Functions again) Something happened in Uzhlyandia again... There are riots on ...

  7. Codeforces Round 313(div1)

    A题: 题目大意: 给出内角全为120度的六边形的六条边的边长,求由多少边长为1的等边三角形构成. 解题思路: 将六边形补全为一个大的等边三角形,则大的等边三角形的边长为六边形的相邻三边之和,接着减去 ...

  8. codeforces #305 div1 done

    总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...

  9. Codeforces #254 div1 B. DZY Loves FFT 暴力乱搞

    B. DZY Loves FFT 题目连接: http://codeforces.com/contest/444/problem/B Description DZY loves Fast Fourie ...

随机推荐

  1. css3学习笔记之用户界面

    CSS3 调整尺寸(Resizing) CSS3中,resize属性指定一个元素是否应该由用户去调整大小. 这个 div 元素由用户调整大小. (在 Firefox 4+, Chrome, 和 Saf ...

  2. lex&yacc2

    YACC: 每个归约后yacc 都执行默认动作,在运行任何明确的动作代码之前,将值$1 赋介$$. 下面是从这个语法中生成的 y.tab.h:#define NAME 257#define NUMBE ...

  3. [java学习笔记]java语言基础概述之转义字符&break&continue

    1.转义字符 \t:制表符 \n:回车 \b:退格 \r:回车 \":双引号 \\:反斜线(常用于文件路径的书写中)   windows系统中回车符其实是由两个符号组成的,\r\n linu ...

  4. 增加用户为SiteCollection的管理员

    1.SiteSettings-->Site collection administrators --> 增加你需要的用户

  5. 【Qt】Qt环境搭建(Visual Studio)【转】

    简述 经常有人问我编写Qt程序时使用什么IDE,其实这个真的很难回答(各有所长),只能说看个人爱好了,因为我两个都用,而且两个都很喜欢(比较多情吧O(∩_∩)O~)! 下面将进行Qt Creator与 ...

  6. [OpenXml] Read/Write row/cell from excel

    public static void test(){ using (SpreadsheetDocument document = SpreadsheetDocument.Open("test ...

  7. 菜鸟聊:PHP

    学习PHP已经有2个月时间了,从一开始的一片空白,到现在的刚刚入门,我对PHP的了解也有更多的认知,希望通过我对PHP的理解,能帮助到更多像我一样的新手更早的认识PHP.(PS:以下内容的一部分是摘自 ...

  8. js判断选择时间不能小于当前时间的代码

    判断选择时间不能小于当前时间的方法有很多,在本文为大家详细介绍下使用js是如何实现的,感兴趣的朋友可以尝试操作下 复制代码代码如下: var controldate;  function checkD ...

  9. 1010. Radix (25)

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  10. cmd&Linux 下使用mysql全记录

    php mysql数据库常用cmd命令集 show databases; 显示数据库 create database name; 创建数据库 use databasename; 选择数据库 drop ...